win32視窗程序的過程

來源:互聯網
上載者:User

標籤:des   style   blog   color   使用   os   io   檔案   

複習一下win32視窗程序

設計一個視窗類別;
註冊視窗類別;
建立視窗;
顯示及更新視窗。
訊息迴圈,去擷取訊息;
視窗過程函數的訊息響應。

設計視窗類別:

typedef struct _WNDCLASS {UINT        style; //視窗類別的類型WNDPROC    lpfnWndProc; //視窗過程函數(回呼函數)   int         cbClsExtra; //為該類設定額外記憶體空間   int         cbWndExtra; //為該視窗設定額外記憶體空間   HANDLE     hInstance; //當前應用程式的執行個體號   ICON       hIcon; //表徵圖,一般用LoadICON函數賦值   HCURSOR     hCursor; //游標,一般用LoadCursor函數賦值   HBRUSH      hbrBackground; //視窗背景GetStockObject()   LPCTSTR     lpszMenuName; //設定菜單名(常量字串)   LPCTSTR     lpszClassName; // 設計一個視窗類別的名字} WNDCLASS;

視窗類別的類型:

在我們的程式中經常要用到一類變數,這個變數裡的每一位(bit)都對應某一種特性。當該變數的某位為1時,表示有該位對應的那種特性,當該位為0時,即沒有該位所對應的特性。當變數中的某幾位同時為1時,就表示同時具有幾種特性的組合。一個變數中的哪一位代表哪種意義,不容易記憶,所以我們經常根據特徵的英文拼字的大寫去定義一些宏,該宏所對應的數值中僅有與該特徵相對應的那一位(bit)為1,其餘的bit都為0。我們使用goto definition就能發現CS_VREDRAW=0x0001,CS_HREDRAW=0x0002,CS_DBLCLKS =0x0008,CS_NOCLOSE=0x0200。他們的共同點就是只有一位為1,其餘位都為0。如果我們希望某一變數的數值既有CS_VREDRAW特性,又有CS_HREDRAW特性,我們只需使用二進位OR(|)操作符將他們進行或運算相組合,如style=CS_VREDRAW | CS_HREDRAW | CS_NOCLOSE。如果我們希望在某一變數原有的幾個特徵上去掉其中一個特徵,用取反(~)之後再進行與(&)運算,就能夠實現,如在剛才的style的基礎上去掉CS_NOCLOSE特徵,可以用style & ~CS_NOCLOSE實現。

視窗過程函數:

第二個成員變數lpfnWndProc指定了這一類型視窗的過程函數,也稱回呼函數。回呼函數的原理是這樣的,當應用程式收到給某一視窗的訊息時(還記得前面講過的訊息通常與視窗相關的嗎?),就應該調用某一函數來處理這條訊息。這一調用過程不用應用程式自己來實施,而由作業系統來完成,但是,回呼函數本身的代碼必須由應用程式自己完成。對於一條訊息,作業系統到底調用應用程式中的哪個函數(回呼函數)來處理呢?作業系統調用的就是接受訊息的視窗所屬的類型中的lpfnWndProc成員指定的函數。每一種不同類型的視窗都有自己專用的回呼函數,該函數就是通過lpfnWndProc成員指定的。

註冊視窗類別:

RegisterClass(&wndclass);

建立視窗:

HWND CreateWindow(    LPCTSTR lpClassName, // pointer to registered class name     LPCTSTR lpWindowName, // pointer to window name     DWORD dwStyle, // window style     int x, // horizontal position of window     int y, // vertical position of window     int nWidth, // window width     int nHeight, // window height     HWND hWndParent, // handle to parent or owner window     HMENU hMenu, // handle to menu or child-window identifier     HANDLE hInstance, // handle to application instance     LPVOID lpParam // pointer to window-creation data );

顯示及更新視窗:

The ShowWindow function sets the specified window‘s show state. BOOL ShowWindow(     HWND hWnd, // handle to window     int nCmdShow // show state of window ); BOOL UpdateWindow(             HWND hWnd // handle of window );

訊息迴圈(擷取訊息):

BOOL GetMessage(        LPMSG lpMsg, // address of structure with message       HWND hWnd, // handle of window        UINT wMsgFilterMin, // first message        UINT wMsgFilterMax // last message );
MSG msg;    while(GetMessage(&msg,NULL,0,0))    {        TranslateMessage(&msg);        DispatchMessage(&msg);    }

視窗過程函數(回呼函數):

LRESULT CALLBACK WinSunProc(  HWND hwnd,      // handle to window  UINT uMsg,      // message identifier  WPARAM wParam,  // first message parameter LPARAM lParam   // second message parameter){    switch(uMsg)    {    case WM_LBUTTONDOWN:        break;    case WM_CLOSE:        break;    default:        return DefWindowProc(hwnd,uMsg,wParam,lParam);    }    return 0;}
//孫鑫視頻案例代碼參考//運行環境Visual C++ :建立 Win32 Application(注意類型) 工程 ,再建立WinMain.cpp C++源檔案)//win32視窗程序#include <windows.h>#include <stdio.h>//視窗過程函式宣告LRESULT CALLBACK WinKevinProc(       HWND hwnd,       UINT uMsg,       WPARAM wParam,       LPARAM lParam       );int WINAPI WinMain(       HINSTANCE hInstance,       HINSTANCE hPrevInstance,       LPSTR   lpCmdLine,       int nCmdShow       ){ //設計一個視窗類別 WNDCLASS wndcls; wndcls.cbClsExtra = 0; wndcls.cbWndExtra = 0; wndcls.hbrBackground = (HBRUSH) GetStockObject(BLACK_BRUSH); wndcls.hIcon = LoadIcon (NULL,IDI_ERROR); wndcls.hCursor = LoadCursor (NULL,IDC_CROSS); wndcls.hInstance = hInstance; wndcls.lpfnWndProc = WinKevinProc;   //回呼函數 wndcls.lpszClassName = "zcx"; wndcls.style = CS_HREDRAW | CS_VREDRAW; wndcls.lpszMenuName = NULL; //註冊視窗類別 RegisterClass(&wndcls); //建立視窗,儲存視窗控制代碼 HWND hwnd; hwnd = CreateWindow ("zcx","**大學", WS_OVERLAPPEDWINDOW, 0, 0, 600, 400, NULL, NULL, hInstance, NULL ); //顯示和重新整理視窗 ShowWindow (hwnd, SW_SHOWNORMAL); UpdateWindow (hwnd); //定義訊息結構體,開始訊息迴圈 MSG msg; while (GetMessage (&msg, NULL, 0, 0 )) {  TranslateMessage (&msg);  DispatchMessage (&msg); }//endof while return 0;} //endof winMain()//編寫視窗過程函數LRESULT CALLBACK WinKevinProc(       HWND hwnd,       UINT uMsg,       WPARAM wParam,       LPARAM lParam       ){ switch(uMsg) { case WM_CHAR:  char szChar[20];  sprintf (szChar , "char is %d",wParam);  MessageBox(hwnd,szChar,"zcx",0);  break; case WM_LBUTTONDOWN:  MessageBox(hwnd,"mouse clicked","zcx",0);  HDC hdc;  hdc = GetDC(hwnd);              //不能在響應WM_PAINT訊息時調用  TextOut (hdc,0,50,"**大學",strlen("**大學"));  ReleaseDC (hwnd,hdc);  break; case WM_PAINT:  HDC hDC;  PAINTSTRUCT ps;  hDC = BeginPaint(hwnd,&ps);          //只能在響應WM_PAINT訊息時調用  TextOut(hDC,0, 0, "zcx",strlen("zcx"));  EndPaint(hwnd,&ps);  break; case WM_CLOSE:  if(IDYES == MessageBox(hwnd,"是否真的退出程式?","彈窗提示",MB_YESNO))  {   DestroyWindow(hwnd);  }//ENDOF IF  break; case WM_DESTROY:  PostQuitMessage(0);  break; default:  return DefWindowProc(hwnd,uMsg, wParam, lParam); }//endof swith() return 0;}//end of WinSunProc()

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.