顯示具有 程式 標籤的文章。 顯示所有文章
顯示具有 程式 標籤的文章。 顯示所有文章

2019年7月30日 星期二

BCB6 擷取作業系統的版本

1. 了解Windows作業系統版本的號碼 : Operating System Version
2. 針對Windows8以上版本,需要使用: Version Helper functions
3. 針對Windows8以下版本,需要使用: GetVersionExA function

以下程式顯示如何取得作業系統的版本


//---------------------------------------------------------------------------
AnsiString GetSystemName()
{
    AnsiString Name=""; //先判斷是否為win8.1或win10
    typedef void(__stdcall*NTPROC)(DWORD*, DWORD*, DWORD*);
    HINSTANCE hinst=LoadLibrary("ntdll.dll");
    DWORD dwMajor, dwMinor, dwBuildNumber;
    NTPROC proc=(NTPROC)GetProcAddress(hinst, "RtlGetNtVersionNumbers");
    proc(&dwMajor, &dwMinor, &dwBuildNumber);
    dwBuildNumber&=0xffff;
    if(dwMajor==6 && dwMinor==3)    //win 8.1
    {
        Name="Microsoft Windows 8.1";
    }
    else if(dwMajor==10 && dwMinor==0)  //win 10
    {
        Name="Microsoft Windows 10";
    }
    else
    {
        //判斷win8.1以下的版本
        SYSTEM_INFO info;       //用SYSTEM_INFO結構判斷64位AMD處理器
        GetSystemInfo(&info);   //呼叫GetSystemInfo函式填充結構
        OSVERSIONINFOEX os;
        os.dwOSVersionInfoSize=sizeof(OSVERSIONINFOEX);
        #pragma warning(disable:4996)
        if(GetVersionEx((OSVERSIONINFO *)&os))
        {   //下面根據版本資訊判斷作業系統名稱
            switch (os.dwMajorVersion)
            {   //判斷主版本號
                case 4:
                    switch (os.dwMinorVersion)
                    {
                        case 0:
                            if(os.dwPlatformId==VER_PLATFORM_WIN32_NT)
                                Name="Microsoft Windows NT 4.0";
                            else if(os.dwPlatformId==VER_PLATFORM_WIN32_WINDOWS)
                                Name="Microsoft Windows 95";
                            break;
                        case 10:
                            Name="Microsoft Windows 98";
                            break;
                        case 90:
                            Name="Microsoft Windows Me";
                            break;
                    }
                    break;
                case 5:
                    switch(os.dwMinorVersion)
                    {
                        case 0:
                            Name="Microsoft Windows 2000";
                            break;
                        case 1:
                            Name="Microsoft Windows XP";
                            break;
                        case 2:
                            if(os.wProductType==VER_NT_WORKSTATION && info.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_AMD64)
                                Name="Microsoft Windows XP Professional x64 Edition";
                            else
                                Name="Microsoft Windows Server 2003";
                    }
                    break;
                case 6:
                    switch(os.dwMinorVersion)
                    {
                        case 0:
                            if(os.wProductType==VER_NT_WORKSTATION)
                                Name="Microsoft Windows Vista";
                            else
                                Name="Microsoft Windows Server 2008";
                            break;
                        case 1:
                            if(os.wProductType==VER_NT_WORKSTATION)
                                Name="Microsoft Windows 7";
                            else
                                Name="Microsoft Windows Server 2008 R2";
                            break;
                        case 2:
                            if(os.wProductType==VER_NT_WORKSTATION)
                                Name="Microsoft Windows 8";
                            else
                                Name="Microsoft Windows Server 2012";
                            break;
                    }
                    break;
            }
        }
    }
    return Name;
}
//---------------------------------------------------------------------------

[+/-] 繼續閱讀...

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; iCount; i+=2)
  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; iHeight; 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程式啦~

[+/-] 繼續閱讀...