開發 windows api的windows程式,需要編寫兩個函式。乙個是winmain()函式,程式的執行從這裡開始,基本的初始化工作也在這裡完成。另乙個是windowproc()函式,該函式由windows呼叫,用來給應用程式傳遞訊息。winmain與windowproc函式通過呼叫系統的api與windows通訊,如圖所示:
winmain()函式等價於控制台的程式中的main()函式,winmain()函式的原型如下:
int winapi winmain(hinstance hinstance, hinstance hprevinstance,lpstr lpcmdline, int ncmdshow);
(1) winapi是乙個windows定義的巨集,將使系統以特定於windows api函式的特種方式處理函式名和實參。
(2) hinstance是指向某個例項的的控制代碼。
(3) hprevinstance是16位作業系統繼承下來的,現在的作業系統可以將這位始終設為空。
(4) lpcmdline是指向某個字串的指標,該字串包括啟動程式的命令列字元。
(5) ncmdshow決定著被建立視窗的外觀。
程式中的winmain()函式需要做以下四件事情:
(1) 指定程式視窗種類
(2) 建立視窗
(3) 初始化視窗
(4) 處理部分訊息
windows使用wndclas***來包含用來指定視窗的資料,wndclas*** 結構用於註冊視窗類,wndclas***的結構定義如下:
struct wndclas*** ;
將wndclas***結構的所有成員都設定為所需的值後,下一步是把相關情況告訴windows。使用registerclas***()來完成這件事。假定wndclas***的物件是windowsclass,則相應的語句如下所示:
registerclas***(&windowsclass);//註冊視窗類
接下來是建立視窗,由createwindow()函式完成。
hwnd hwnd; //窗體控制代碼
hwnd = createwindow(
_t("a basic window the hard way"), //標題欄文字
cw_usedefault, // 窗體位置
cw_usedefault, // 左上角位置座標
cw_usedefault, // 窗體長度
cw_usedefault, // 窗體高度
nullptr, // 如果不是父窗體設定為空
nullptr, // 沒有選單設定為空
hinstance, // program instance handle
nullptr // no window creation data
);
在呼叫createwindow()函式後,被建立的視窗現在已經存在,但是還沒有顯示在螢幕上。需要呼叫另乙個windows api函式將該視窗顯示出來:
showwindow(hwnd, ncmdshow);
第乙個引數是createwindow()函式返回的控制代碼。第二個引數是給winmain()傳遞的ncmdshow值,它指出在螢幕顯示視窗的方式。
在呼叫 showwindow()函式後,該視窗將出現在螢幕上,但仍然沒有應用程式的內容。繪製工作區的最好方法是把繪製工作區的**放入windowproc()函式,並使windows給程式傳送請求重畫工作區的訊息。呼叫另乙個windows api函式updatewindow(),請求windows給程式傳送一條重畫視窗工作區的訊息。呼叫該函式的視窗如下:
updatewindow(hwnd);
windows有兩種訊息:一種是排隊訊息,winmain()從佇列中提取這些訊息進行處理,稱為訊息迴圈;另一種是致使windows直接呼叫windowsproc()函式的非排隊訊息。我們在winmain()函式的訊息迴圈中所作的事情是從windows為應用程式排好的訊息佇列中提取一條訊息,然後請求windows呼叫windowsproc()函式來處理該訊息。
while (getmessage(&msg, nullptr, 0, 0) == true) // get any messages
使windows以我們希望的方式執行的所有**都在程式的訊息處理部分——windowproc()函式
windowproc()函式的原型如下:
lresult callback windowproc(hwnd hwnd, uint message,wparam wparam, lparam lparam);
可以使用winapi替代callback,但後者更好地表達出這個函式的作用。每個引數的意義如下:
hwnd hwnd : 乙個控制代碼,事件引起訊息發生的視窗
uint message: 訊息的id,指出訊息型別的32為整數值
wparam wparam : 32位值,包含附加資訊,決定於訊息的種類
lparam lparam: 32位值
switch (message) // process selected messages
#include #include lresult callback windowproc(hwnd hwnd, uint message,
wparam wparam, lparam lparam);
int winapi winmain(hinstance hinstance, hinstance hprevinstance,
lpstr lpcmdline, int ncmdshow)
return static_cast(msg.wparam); // end, so return to windows
}lresult callback windowproc(hwnd hwnd, uint message,
wparam wparam, lparam lparam)
return defwindowproc(hwnd, message, wparam, lparam);
}
關於C WINDOWS開發 複雜控制項程式
faq 關於c windows開發 複雜控制項程式 public form1 用於儲存主窗體支援的所有字型族的名稱 private string fontfamilynames 獲取主窗體支援的字型族 private void getfontfamilies 按鈕控制項btncut的click事件的...
關於C WINDOWS開發 複雜控制項程式
faq 關於c windows開發 複雜控制項程式 public form1 用於儲存主窗體支援的所有字型族的名稱 private string fontfamilynames 獲取主窗體支援的字型族 private void getfontfamilies 按鈕控制項btncut的click事件的...
C windows程式結構
乙個簡單的windows程式主要包括應用程式主函式winmain函式和訊息處理函式,winmain函式的主要工作是定義視窗 註冊視窗 顯示視窗 訊息迴圈 訊息處理函式的主要工作是處理幹興趣的訊息。下面的示例程式顯示了乙個簡單的視窗程式的結構。例 乙個簡單的windows程式。include lres...