visual c++基礎(windows窗口程序解析)


windows和應用的交互都是用消息機制的。win系統和應用之間的關系如下:

 

在消息隊列中存儲要和用戶應用直接的交互信息,消息隊列是一個隊列,是先進先出的機制。

其中消息的內容為:

typedef struct tagMSG {     // msg 
    HWND   hwnd;     //這是句柄,就是資源的標識,比如說這是標識哪個窗口
    UINT   message; //這是一個無符號整型,標識是用戶的哪種動作,比如按下鼠標左鍵,就是WM_LBUTTONDOWN
    WPARAM wParam; //附加信息,比如按下鍵盤A,附加就是A的ascii碼
    LPARAM lParam; //也是附加消息
    DWORD  time; //消息的時間
    POINT  pt; //光標的位置,就是鼠標的位置
} MSG; 

  

Windows程序的入口:(WinMain)
int WINAPI WinMain(
  HINSTANCE hInstance,  // handle to current instance 實例資源的標識
  HINSTANCE hPrevInstance,  // handle to previous instance 上一個實例資源的標識
  LPSTR lpCmdLine,      // pointer to command line 命令
  int nCmdShow          // show state of window 顯示的狀態,有顯示、隱藏、最大化等。
);

  

WNDCLASS是窗口類

typedef struct _WNDCLASS { 
    UINT    style; //窗口類型
    WNDPROC lpfnWndProc; //窗口過程,是一個回調函數
    int     cbClsExtra; //附加值 默認0
    int     cbWndExtra; //附加內存 默認0
    HANDLE  hInstance; //實例標識
    HICON   hIcon; //窗口圖標,左上角的圖標
    HCURSOR hCursor; //光標,鼠標的類型
    HBRUSH  hbrBackground; //畫筆顏色
    LPCTSTR lpszMenuName; //菜單的名稱
    LPCTSTR lpszClassName; //類的名字
} WNDCLASS; 

  


窗口類型:(UINT style;
在我們的程序中經常要用到一類變量,這個變量里的每一位(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實現。
窗口調用函數:( WNDPROC lpfnWndProc
第二個成員變量lpfnWndProc指定了這一類型窗口的過程函數,也稱回調函數。回調函數的原理是這樣的,當應用程序收到給某一窗口的消息時(還記得前面講過的消息通常與窗口相關的嗎?),就應該調用某一函數來處理這條消息。這一調用過程不用應用程序自己來實施,而由操作系統來完成,但是,回調函數本身的代碼必須由應用程序自己完成。對於一條消息,操作系統到底調用應用程序中的哪個函數(回調函數)來處理呢?操作系統調用的就是接受消息的窗口所屬的類型中的lpfnWndProc成員指定的函數。每一種不同類型的窗口都有自己專用的回調函數,該函數就是通過lpfnWndProc成員指定的。
 
創建窗口過程:
1.要先注冊一個窗口
ATOM RegisterClassEx( CONST WNDCLASSEX *lpwcx // address of structure with class data
);
2.然后調用CreateWindow創建一個窗口。
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
);

  

3:顯示窗口:ShowWindow
BOOL ShowWindow(
  HWND hWnd,     // handle to window
  int nCmdShow   // show state of window
);

  


4:刷新窗口:
UpdateWindow
最后刷新窗口。


 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM