02 使用Windows API建立視窗

2021-09-13 10:51:34 字數 3180 閱讀 3487

1、開啟visual studio 2017,其他visual studio版本也可以

2、新建乙個windows桌面嚮導專案,或者win32應用程式專案都可以

3、新建專案時,選擇windows應用程式,並勾上空專案

4、新加原始檔,注意因為windowsapi都是c語言實現,所以,新加檔案的字尾要是*.c檔案

5、實現功能,原始碼如下:

必要解釋:

wm_paint訊息:當視窗客戶區的一部分或者全部變為「 無效」 時, 系統會傳送 wm_paint 訊息,通知應用程式重新繪製視窗。當視窗剛建立的時候, 整個客戶區都是無效的。因為這個時候程式還沒有在視窗上繪製任何東西,當呼叫 updatewindow 函式時,會傳送 wm_paint 訊息給視窗過程,對視窗進行重新整理。當視窗從無到有、改變尺寸、最小化後再恢復、被其他視窗遮蓋後再顯示時, 視窗的客戶區都將變為無效, 時系統會給應用程式傳送 wm_paint 訊息,通知應用程式重新繪製。

wm_close訊息:對 wm_close 訊息的響應並不是必須的,如果應用程式沒有對該訊息進行響應, 系統將把這條訊息傳給 defwindowproc 函式而 defwindowproc 函式則呼叫 destroywindow 函式來響應這條 wm_close 訊息。

wm_destroy訊息:destroywindow 函式在銷毀視窗後,會給視窗過程傳送 wm_destroy訊息,我們在該訊息的響應**中呼叫 postquitmessage 函式。postquitmessage函式向應用程式的訊息佇列中投遞一條 wm_quit 訊息並返回。我們在前邊介紹過,getmessage 函式只有在收到 wm_quit 訊息時才返回 0,此時訊息迴圈才結束,程式退出。要想讓程式正常退出, 我們必須響應 wm_destroy 訊息,並在訊息響應**中呼叫postquitmessage,向應用程式的訊息佇列中投遞 wm_quit 訊息。傳遞給 postquitmessage函式的引數值將作為 wm_quit 訊息的 wparam 引數,這個值通常用做 winmain 函式的返回值。

beginpaintendpaint函式:beginpaint 函式的第 1 個引數是視窗的控制代碼,第二個引數是 paintstruct 結構體的指標,該結構體物件用於接收繪製的資訊。在 調 用 beginpaint 時,如果客戶區的背景還沒有被擦除, 那麼 beginpaint 會 發 送wm_erasebkgnd 訊息給視窗, 系統就會使用 wndclass 結構體的 hbrbackground 成員指定的畫刷來擦除背景。在響應 wm_paint 訊息的**中, 要得到視窗的 dc, 必須呼叫 beginpaint 函式。beginpaint 函式也只能在 wm_paint 訊息的響應**中使用, 在其他地方, 只能使用getdc 來得到 dc 的控制代碼。 另外, beginpaint 函式得到的 dc, 必須用 endpaint 函式去釋放。

textout函式: 呼叫 textout 函式在(300, 300) 的位置輸出乙個字串「hello,mfc!」。當發生重繪時,視窗中的文字和圖形都會被擦除。在擦除背景後,textout 函式又一次執行,在視窗中再次繪製出 「hello,mfc!」。 這個過程對使用者來說是透明的,使用者並不知道程式執行的過程,給使用者的感覺就是你在響應 wm_paint 訊息的**中輸出的文字或圖形始終保持在視窗中。換句話說,如果我們想要讓某個圖形始終在視窗中顯示, 就應該將圖形的繪製操作放到響應 wm_paint 訊息的**中。

defwindowproc函式:呼叫預設的視窗過程,對應用程式沒有處理的其他訊息提供預設處理。對於大多數的訊息,應用程式都可以直接呼叫 defwindowproc函式進行處理。在編寫視窗過程時,應該將 defwindowproc 函式的呼叫放到 default 語句中,並將該函式的返回值作為視窗過程函式的返回值。

sendmessage傳送「不進隊訊息」,直接把訊息傳送給視窗,並呼叫該視窗的視窗過程函式進行處理。在視窗過程對訊息處理完畢後,返回處理結果。

postmessage傳送「進隊訊息」。將訊息放入與建立視窗的執行緒相關聯的訊息佇列後立即返回。

/* 注意此時必須包含windows.**件 */

#include //視窗過程函式

lresult callback dealmessage(hwnd hwnd, //視窗控制代碼,訊息所屬的視窗

uint umsg, //訊息標誌

wparam wparam, //附加資訊

lparam lparam

) case wm_destroy:

postquitmessage(2); //wm_quit, 給主函式 return msg.wparam

break;

default:

/* 該函式對未被處理的訊息提供預設響應 */

return defwindowproc(hwnd, umsg, wparam, lparam);

} return 0;

}//winapi: 修飾函式,規定函式引數入棧從右往左,函式呼叫完畢,自動清理堆疊

//callback

int winapi winmain(hinstance hinstance, //應用程式例項

hinstance hprevinstance, //上乙個應用程式例項,不用

lpstr lpcmdline, //命令列引數

int ncmdshow //視窗顯示的樣式, 最大化,最小化

) return msg.wparam;

}​​

6、按下左鍵,效果如下:

雲創動力day02

一 學習的內容 今天學習了三章的內容 第三章 分支結構 if分支 巢狀,並列 switch分支 表示式型別可以是byte,char,sgort,enum,string jdk1.7新增 break和default是可選結構 第四章 迴圈結構 while迴圈 while 布林表示式 do while ...

使用multiprocessing模組建立程序

author 來童星 date 2019 12 17 from multiprocessing import process import time import os 兩個子程序將會呼叫的兩個方法 def child 1 i print 子程序 s 開始執行,父程序為 s os.getpid os...

C 中使用windows API,及相關指標

沒有感覺到能寫些對其他人有幫助的東西 羅雲彬的 windows32位彙編那本書敲 敲到第9章了,也是第3遍看了,估計也是再看最後一兩遍了,等都抄一遍之後在看看有些什麼值得寫的吧以前用的乙個東西,能讓沒用過的人省些時間吧 c 呼叫windowsapi時,方法和c 那種取得getprocaddress的...