2019年7月30日 星期二
BCB6 擷取作業系統的版本
2009年3月23日 星期一
C語言 - 條件運算符
為了縮短程式碼,所以大家都會無所不用其極的用很短的行數去表示很多的東西
在if判斷式的部分,某些狀況下可以採用 "條件運算符" 來達成減少行數的目的
原本的程式如果是
if(x>y)
a=x;
else
a=y;
則使用 條件運算符 後,會變成下面這一行:
a=((x>y)?x:y);
瞬間由四行變成一行。
ps.這我之前就有學過,可是常常會忘記捏~~
2009年3月19日 星期四
BCB - EZCam
在BCB裡面要存取Camera有幾種方式:
1.採用 Video For Windows (VFW)方式,這在李遠坤老師的部落格有很詳盡的介紹,不過這元件有點舊就是了。
2.採用 DSpack,這是Windows底下新的 SDK,沒用過,要用請自己上網找資料囉
3.OpenCV,不過我在BCB上一直搞不定,所以最後只好放棄。
然後是我在K.Top上找到有人分享的VCL原件 -- EZCam
用法很簡單,只要在From裡面拉一個EzCapCamera元件,然後放置以下的一行程式碼,畫面就出來啦:
EzCapCamera1->CameraDisplay();
其他的功能只要看他原始碼的Header檔,簡單明瞭。
void __fastcall CameraDisconnect(); //攝影機離線
void __fastcall CameraClose(); //關閉攝影機畫面
void __fastcall VideoSourceDlg(); //攝影機Source對話窗
void __fastcall VideoFormatDlg(); //攝影機Format對話窗
void __fastcall VideoCompressDlg(); //攝影機壓縮方式對話窗
void __fastcall CapAVI(String); //擷取AVI檔案
void __fastcall CapBmpPic(String); //擷取BMP圖片
void __fastcall CapJpgPic(String); //擷取JPG圖片
void __fastcall CapBitmapFrame(Graphics::TBitmap*); //暫存於TBitmap中
BCB - YbCommDevice
因為有使用到RS-232,所以就在網路上隨便找
找著找著就找到了一個人家寫好的原件
Victor 串口 VCL 控件
至於使用方法的話,就參考檔案裡面的範例吧~
如果說程式碼內的註解是亂碼+簡體看不慣的話,
可以用Firefox開啟,搭配新同文堂,就可以很順利的看懂啦!
2009年3月16日 星期一
BCB - 開啟文字檔
以前寫C語言的時候,開關檔會用fopen(), fclose
再加上fflush()及時寫入檔案中
但是在BCB有簡單的做法,可以用Memo元件,也可以使用TStringList唷!
先講開檔:
TStringList *sl=new TStringList;
sl->LoadFromFile("temp.txt");
for(int i=0; i
Edit[i]->Text=sl->Strings[i];
delete sl;
真是簡單到一個爆炸
然後講存檔:
TStringList *sl=new TStringList;
sl->Add(Edit1->Text);
sl->Add(Edit2->Text);
sl->SaveToFile("temp.txt");
delete sl;
結論就是這麼簡單呀~
最後加碼講一下TStringList的字串切割好了
String Str_temp = "你的阿里阿雜的文字,可能是用逗號分隔";
TStringList *StrLst1= new TStringList();
StrLst1->Delimiter=',' ; //你的分隔的符號
StrLst1->DelimitedText = Str_temp; //要分割的字符串
String Str1= StrLst1->Strings[0] ; //等於"你的阿里阿雜的文字"
String Str2= StrLst1->Strings[1] ; //等於"可能是用逗號分隔"
2009年3月13日 星期五
BCB - 將文字轉為16x16的點陣字
因為某些需要,得將文字以16x16的點陣圖輸出,所以就到網路上四處搜尋
最後讓我找到了一篇用Delphi寫的 抓Windows字型產生BIT資料的程式範例
可是他是Delphi,我用的卻是BCB
所以就開始解讀Delphi的工作啦~~
最後被我改寫:
//半形字轉為全形字
int Len = Edit->Text.Length();
char buf[255];
ZeroMemory(buf, sizeof(buf));
LCMapString(GetUserDefaultLCID(), LCMAP_FULLWIDTH, Edit->Text.c_str(), Len, buf, sizeof(buf));
AnsiString Zen = AnsiString(buf);
//將字串轉換成16x16的點陣圖
//本來用TImage,可是會漏字,所以改用TBitmap
Graphics::TBitmap *ImageText = new Graphics::TBitmap();
ImageText->Canvas->Font->Name = "細明體";
ImageText->Canvas->Font->Size = 12;
ImageText->Width = ImageText->Canvas->TextWidth(Zen.c_str());
ImageText->Height = ImageText->Canvas->TextHeight(Zen.c_str());
ImageText->Canvas->TextOut(0, 0, Zen.c_str());
int i, j, k;
COLORREF color;
int R_byte;
//每次跳過一個字的寬度
for(j=0; j>Width; j+=16)
{
unsigned char word[32];
int l=0;
//某字的高度
for(i=0; i
{
byte a = 0;
byte b = 0x80;
//某字的寬度
for(k=0; k<16; k++)
{
//判斷該像素值
color = ImageText->Canvas->Pixels[j+k][i];
R_byte = GetBValue(color);
if(R_byte==0)
a=a|b;
b=b>>1;
if(b==0)
{
word[l] = char(a);
b=0x80;
a=0;
l++;
}
}
if(b!=0x80)
{
word[l] = char(a);
l++;
}
}
}
其實中間判斷像素值的地方我看不太懂,有沒有人可以幫我解釋一下阿?
最後那個word[32]就是所謂的點陣字了
神奇的是:一定要用"細明體",而且字體大小要等於"12"才會剛好16x16。
2009年3月11日 星期三
BCB - Double Buffered
寫程式經常在畫面重新繪製時,會出現閃爍的狀況
這時候就需要 Double Buffered 的機制來防止這樣子的閃爍。
在BCB底下我找到了兩種方法:
1. 先暫存現在的畫面,然後在暫存的記憶體空間畫上新的畫面,再貼回去顯示的畫面上。
使用方式可以參考這一篇文章 Displaying your bitmaps quickly
不過我用了之後,好像沒啥效果,所以又找到了第二種方法:
在Panel或Form上設置DoubleBuffered的屬性為true即可,簡單又有效。
Panel->DoubleBuffered = true;
或
Form->DoubleBuffered = true;
另外要播放聲音的話,很簡單,像下面那樣就可以啦。
#include
sndPlaySound(path_file,SND_ASYNC);
2009年2月4日 星期三
Hello World - 我在黑洞的第一支程式
因為第一次接觸WinCE的東東,所以不是很熟,在此紀錄一下我的第一支程式
也是大名鼎鼎的"Hello World"
首先當然是打開 Visio Studio 2008 (啥版本應該都ok吧 @@a)
接著就"檔案"->"新增"->"專案"
選取"智慧型裝置"->"Win32智慧型裝置專案"
輸入名稱後,確定即可
然後會看到這個畫面,按"下一步"
因為做的是PPC,所以要新增"Pocket PC 2003",繼續下一步
基本上這樣就"完成"啦
然後找到程式碼內 "// TODO: 在此加入任何繪圖程式碼..."
我輸入了:
RECT rect;
GetClientRect(hWnd, &rect);
DrawText (hdc, TEXT("Hellow World!"), -1, &rect,
DT_CENTER | DT_VCENTER | DT_SINGLELINE);
然後按下"Debug",會先看到一支PDA模擬器,然後再過一下下,就會出現我的HelloWorld程式啦~