日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

win32应用程序创建流程

發(fā)布時間:2025/3/15 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 win32应用程序创建流程 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

窗口創(chuàng)建過程


創(chuàng)建一個完整的窗口,需要經(jīng)過下面幾個操作步驟:

1.編寫WinMain函數(shù)(可以查看MSDN)。

2.設(shè)計(jì)窗口類(WNDCLASS)。

3.注冊窗口類。

4.創(chuàng)建窗口。

5.顯示并更新窗口。

6.編寫消息循環(huán)。

7.編程窗口過程函數(shù)。


編寫WinMain函數(shù)


WinMain是Windows程序的入口點(diǎn)函數(shù),當(dāng)操作系統(tǒng)啟動一個程序時,它就調(diào)用該程序的WinMain函數(shù)。它和DOS程序的入口點(diǎn)函數(shù)main是一樣的作用。

WinMain函數(shù)的原型聲明如下:

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nShowCmd); 參數(shù)說明:
  • hInstance 表示該程序當(dāng)前運(yùn)行的實(shí)例句柄,這是一個數(shù)值,操作系統(tǒng)會為每個運(yùn)行中的實(shí)例分配句柄值。
  • hPrevInstance 當(dāng)前實(shí)例的前一個句柄的實(shí)例。
  • lpCmdLine 指定給應(yīng)用程序的命令行參數(shù)。
  • nShowCmd 指定程序的窗口應(yīng)該如何顯示。


設(shè)計(jì)窗口類


一個完整的窗口類具有許多特征,包括光標(biāo)(鼠標(biāo)進(jìn)入該窗口時的形狀)、圖標(biāo)、背景顏色等,在創(chuàng)建一個窗口前,需要對一個窗口進(jìn)行設(shè)計(jì),在windows中,窗口的特征有WNDCLASS結(jié)構(gòu)體來定義,WNDCLASS結(jié)構(gòu)體的定義如下:

typedef struct {UINT style; //這一類型窗口的樣式WNDPROC lpfnWndProc; //指向窗口過程的函數(shù)指針int cbClsExtra; //類附加內(nèi)存int cbWndExtra; //窗口附加內(nèi)存HINSTANCE hInstance; //實(shí)例句柄HICON hIcon; //窗口類的圖標(biāo)句柄HCURSOR hCursor; //窗口類的光標(biāo)句柄HBRUSH hbrBackground; //窗口類的背景 LPCTSTR lpszMenuName; //菜單名字LPCTSTR lpszClassName; //窗口類名字 } WNDCLASS;


注冊窗口


設(shè)計(jì)完窗口類后,需要調(diào)用RegisterClass函數(shù)對其注冊,注冊成功后,才可以創(chuàng)建該類型的窗口。函數(shù)聲明如下:

ATOM RegisterClass(const WNDCLASS* lpWndClass);


創(chuàng)建窗口


設(shè)計(jì)好窗口類并進(jìn)行注冊成功之后,就可以利用CreateWindow函數(shù)產(chǎn)生這種類型的窗口了,其函數(shù)聲明如下:

HWND CreateWindow(LPCTSTR lpClassName, //指定窗口類的名稱,需要和WNDCLASS的className一樣。LPCTSTR lpWindowName, //窗口的名字DWORD dwStyle, //創(chuàng)建的窗口樣式int x, //窗口左上角的x坐標(biāo)int y, //窗口左上角的y坐標(biāo)int nWidth, //窗口寬度int nHeight, //窗口高度HWND hWndParent, //父窗口句柄HMENU hMenu, //窗口菜單的句柄HANDLE hInstance, //應(yīng)用程序句柄PVOID lpParam ); //附件參數(shù),多文檔窗口為CLIENTCREATESTRUCT結(jié)構(gòu)體,其余多是NULL

顯示窗口


窗口創(chuàng)建成功之后,我們要讓它顯示出來,調(diào)用函數(shù)ShowWindow來顯示窗口,函數(shù)原型如下:

BOOL ShowWindow(HWND hWnd, int nCmdShow);nCmdShow指定了窗口顯示的狀態(tài),具體窗口狀態(tài)可以查看MSDN


更新窗口


被調(diào)用ShowWindow函數(shù)之后,我們需要緊接調(diào)用UpdateWindow來刷新窗口。UpdateWindow函數(shù)聲明如下:

BOOL UpdateWindow(HWND hWnd// handle to window);其參數(shù)是創(chuàng)建成功后的窗口句柄,UpdateWindow函數(shù)通過發(fā)送一個WM_PAINT消息來刷新窗口,UpdateWindow將WM_PAINT消息直接發(fā)送給了窗口過程函數(shù)進(jìn)行消息處理,而沒有放到消息隊(duì)列中去。


消息循環(huán)


在創(chuàng)建窗口、顯示窗口、更新窗口后,我們需要編寫一個消息循環(huán),不斷地從消息隊(duì)列中取出消息,并進(jìn)行響應(yīng)。獲取消息可以調(diào)用GetMessage()函數(shù),消息循環(huán)常見代碼如下:

MSG msgInfo;while (GetMessage(&msgInfo, NULL, 0, 0)){TranslateMessage(&msgInfo);DispatchMessage(&msgInfo);}

更多內(nèi)容見“windows消息處理機(jī)制”。


編程窗口過程函數(shù)


在完成上述步驟后,剩下的工作主要是編寫一個窗口過程函數(shù),用于處理發(fā)送給窗口的消息。一個Windows應(yīng)用程序的主要代碼部分就隱藏在窗口過程,其函數(shù)聲明如下:

LRESULT CALLBACK WindowProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam);

窗口過程函數(shù)的名字是可隨便命名的,但函數(shù)定義的形式必須和上述聲明保持一致。WindowProc函數(shù)的4個參數(shù)分別對應(yīng)消息的窗口句柄。消息代碼、消息代碼的兩個附加參數(shù)。

一個程序可以有多個窗口,窗口過程函數(shù)的hwnd就標(biāo)識了接收消息的特定窗口。在窗口過程函數(shù)內(nèi)部使用switch/case語句來確定窗口過程接收消息類型以及消息的處理。例如:

//編寫窗口過程函數(shù) LRESULT CALLBACK WindProc (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {switch (uMsg){case WM_CHAR:{char szMsg[20] = {0};sprintf_s(szMsg,"char code is %d", wParam);MessageBox(hWnd,szMsg, "char", 0);break;}case WM_PAINT:...case WM_CLOSE:...case WM_DESTROY:...default: return DefWindowProc(hWnd,uMsg,wParam,lParam);} }

完整代碼

#include <Windows.h> #include <stdio.h>//窗口過程函數(shù)聲明 LRESULT CALLBACK WndProcess(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);/**************************************************************** *函數(shù)名稱:WinMain *功 能:winddow應(yīng)用程序入口 *作 者:Jin *日 期:2016年8月10日 ****************************************************************/ int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow) {//設(shè)計(jì)窗口類WNDCLASS wndcls;wndcls.cbClsExtra = 0;wndcls.cbWndExtra = 0;wndcls.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);wndcls.hCursor = LoadCursor(NULL, IDC_ARROW);wndcls.hIcon = LoadIcon(NULL, IDI_APPLICATION);wndcls.hInstance = hInstance;wndcls.lpfnWndProc = WndProcess;wndcls.lpszClassName = "Jin";wndcls.lpszMenuName = NULL;//垂直和橫軸大小發(fā)生變化,窗口重繪wndcls.style = CS_HREDRAW | CS_VREDRAW; //注冊窗口RegisterClass(&wndcls);HWND hWnd = NULL;//創(chuàng)建窗口hWnd = CreateWindow("Jin", "Jin Win32", WS_OVERLAPPEDWINDOW, 0, 0,\600, 400, NULL, NULL, hInstance, NULL);//顯示&刷新ShowWindow(hWnd,SW_SHOWNORMAL);UpdateWindow(hWnd);//定義消息循環(huán)MSG msgInfo;while (GetMessage(&msgInfo, NULL/*所有窗口*/, 0, 0)){TranslateMessage(&msgInfo); //換字符消息DispatchMessage(&msgInfo); //分發(fā)消息}return msgInfo.wParam; }/**************************************************************** *函數(shù)名稱:WndProcess *功 能:窗口過程消對應(yīng)的消息處理 *作 者:Jin *日 期:2016年8月21日 ****************************************************************/ LRESULT CALLBACK WndProcess(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {switch (uMsg){case WM_CHAR:{char szChar[20] = {0};sprintf_s(szChar,"char code is %d", wParam);MessageBox(hWnd,szChar, "char", MB_OK);break;}case WM_LBUTTONDOWN:{MessageBox(hWnd, "mouse clicked", "mouse", MB_OK);HDC hDc;hDc = GetDC(hWnd);TextOut(hDc, 0, 50, "hello world", strlen("hello world"));ReleaseDC(hWnd,hDc);break;}case WM_PAINT:{HDC hDC;PAINTSTRUCT ps;hDC = BeginPaint(hWnd, &ps);TextOut(hDC,0,0,"CSDN", strlen("CSDN"));EndPaint(hWnd, &ps);break;}case WM_CLOSE:{if (IDYES == MessageBox(hWnd, "are you sure to exit?", "message", MB_YESNO)){DestroyWindow(hWnd);//窗口消失,產(chǎn)生WM_DESTROY新消息}break;}case WM_DESTROY:{PostQuitMessage(0);//產(chǎn)生WM_QUIT消息,然后程序退出break;}default: return DefWindowProc(hWnd,uMsg,wParam,lParam);}return 0; }

運(yùn)行初始結(jié)果



轉(zhuǎn)載于:https://www.cnblogs.com/jinxiang1224/p/8468390.html

總結(jié)

以上是生活随笔為你收集整理的win32应用程序创建流程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。