C語言調用WIN32 API學習之1創建窗口


本學習筆記基於VC++6.0開發環境,通過c語言編程語言,調用win32 API進行windows系統應用程序開發。

1,打開VC++6.0,點擊 文件->新建->工程->Win32 Application 工程名填寫example1,點擊確定,選擇 一個空工程,點擊完成。

2,點擊"新建文件" 按鈕,新建一個空白文件,點擊 文件->另存為 輸入文件名example1.c 選擇工作空間對應的文件夾,保存。

3,點擊FileView,右擊Source File,點擊 添加文件到目錄,選擇example1.c,點擊確定。

4,添加代碼

#include <windows.h>
#include <Shlwapi.h>


LRESULT CALLBACK WinSunProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam);  //聲明消息回調函數

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPreInstance,PTSTR szCmdLine,int iCmdShow)  //Win32 Api 主程序函數入口
{
WNDCLASS wndcls;                                                                 //定義窗體類
HWND hwnd;                                                                          //定義句柄用來保存成功創建窗口后返回的句柄
MSG msg;                                                                                     //定義消息結構體變量
wndcls.cbClsExtra=0;                                                                     //結構體后附加的字節數,一般總為0
wndcls.cbWndExtra=0;                                                                  //窗體實例附加的字節數,一般總為0
wndcls.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH);   //背景顏色
wndcls.hCursor=LoadCursor(NULL,IDC_ARROW);                            //光標句柄
wndcls.hIcon=LoadIcon(NULL,IDI_APPLICATION);                            //圖標句柄 任務欄顯示的圖標
wndcls.hInstance=hInstance;                                                        //模塊句柄
wndcls.lpfnWndProc=WinSunProc;                                             //函數指針,指向處理窗口消息的函數入口
wndcls.lpszClassName="windows";                                             //自定義類名,不要與其他類名重復
wndcls.lpszMenuName=NULL;                                                    //菜單名的字符串
wndcls.style=CS_HREDRAW | CS_VREDRAW;                            //指定窗口風格 詳見參數注釋1
if (!RegisterClass (&wndcls))return 0;                                        //注冊窗體類,如果失敗直接返回0結束程序
hwnd=CreateWindow("windows","創建一個新窗口",WS_OVERLAPPEDWINDOW,0,0,300,150,NULL,NULL,hInstance,NULL);//創建窗體

//APIWS_OVERLAPPEDWINDOW為 Window Styles  //詳見參數注釋2
ShowWindow(hwnd,SW_SHOWNORMAL);//顯示窗體的API 傳入需要顯示的窗體句柄和顯示方式
UpdateWindow(hwnd);//刷新窗體的API

while(GetMessage(&msg,NULL,0,0))//進入消息循環
{
TranslateMessage(&msg);//將虛擬鍵消息轉換為字符消息。字符消息被送到調用線程的消息隊列中,在下一次線程調用函數GetMessage或PeekMessage時被讀出
DispatchMessage(&msg); //該函數調度一個消息給窗口程序。通常調度從GetMessage取得的消息。消息被調度到的窗口程序即是MainProc()函數
}
return 0;
}
LRESULT CALLBACK WinSunProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam)//回調函數定義
{
switch(uMsg)
{
case WM_DESTROY://關閉窗口是系統發送的消息
PostQuitMessage(0);//發送退出消息GetMessage收到消息后將return 0,主函數退出消息循環
break;
default:
return DefWindowProc(hwnd,uMsg,wParam,lParam);//不處理的消息交給系統處理。
}
return 0;
}

5,參數詳細分析

參數注釋1

窗口類風格參數

      1,CS_VREDRAW: 當垂直長度改變或移動窗口時,重畫整個窗口

      2,CS_HREDRAW: 當水平長度改變或移動窗口時,重畫整個窗口

  3,CS_DBLCLKS: 允許向窗口發送雙擊鼠標鍵的消息

   當雙擊窗體時

   如果窗口沒有CS_DBLCLKS標志,則系統向窗口依次發送如下消息:

   1 WM_LBUTTONDOWN  2 WM_LBUTTONUP   3 WM_LBUTTONDOWN   4 WM_LBUTTONUP

   如果窗口有CS_DBLCLKS標志,則系統向窗口依次發送如下消息:

   1 WM_LBUTTONDOWN  2 WM_LBUTTONUP   3 WM_LBUTTONDBLCLK  4 WM_LBUTTONUP

  4,CS_GLOBALCLASS: 當調用CreateWindow 或 CreateWindowEx 函數來創建窗口時允許它的hInstance參數和注冊窗口類時傳遞給

  RegisterClass 的 hInstance參數不同。如果不指定該風格,則這兩個 hInstance 必須相同。

      5,CS_BYTEALIGNCLIENT: 在字節邊界上(在x方向上)定位窗口的用戶區域的位置

  6,CS_BYTEALIGNWINDOW: 在字節邊界上(在x方向上)定位窗口的位置

  7,CS_CLASSDC: 該窗口類的所有窗口實例都共享一個窗口類DC

  8,CS_OWNDC: 給予每個窗口實例它本身的DC。注意,盡管這樣是很方便,但它必須慎重使用,因為每個DC大約要占800個字節的內存。

  9,CS_PARENTDC: 將子窗口的裁剪區域設置到父窗口的DC中去,這樣子窗口便可以在父窗口上繪制自身。注意,這是子窗口還是從系統緩存中獲取DC,而不是使用父窗口的DC。使用該風格可以提高系統性能。

  10,CS_NOCLOSE: 禁止系統菜單的關閉選項

  11,CS_SAVEBITS: 以位圖形式保存被該窗口遮擋的屏幕部分,這樣當給窗口移動以后,系統便可以用該保存的位圖恢復屏幕移動的相應部分,從而系統不用向被該窗口遮擋的窗口發送 WM_PAINT 消息。該特性對於菜單類型的窗口比較合適,因為它通常是簡短的顯示一下之后便消失。設置該特性將增加顯示該窗口的時間,因為它通常要先分配保存位圖的內存。

參數注釋2

1,WS_OVERLAPPED

重疊窗口(overlapped window),具有應用程序主窗口的全部特點。它的非客戶區包括一個可伸縮的框架、菜單條、標題欄和最小化、最大化按鈕。

2,WS_POPUP
彈出窗口(popup window),具有消息框或者對話框的全部特點。它的非客戶區包括一個固定大小的框架和一個標題欄。

3,WS_CHILD

子窗口(child window),具有類似按鈕控件的全部特點。它沒有非客戶區,窗口的處理過程負責繪制窗口的每個部分。

4,WS_MINIMIZE

表示窗口是最小化的

5,WS_MAXIMIZE

表示窗口是最大化的

6,WS_VISIBLE

控制窗體是否顯示
7,WS_DISABLED

控制窗體是否可用
8,WS_CLIPSIBLINGS

這個屬性的含義需要特別注意,它的意思就是剪輯兄弟窗口,也就是不對兄弟窗口進行繪制,為什么會繪制兄弟窗口?因為兩個窗口可能會重疊!!!如果父親窗口是overlapped的重疊窗口,那么兄弟窗口必然會涉及到覆蓋剪輯問題。如果某子窗口使用了ws_clipsiblings屬性,那么被該窗口覆蓋的兄弟窗口區域本窗口就不在進行繪制了,就是說本窗口不繪制在其下面還有兄弟窗口的那部分窗口,效果就是在其下面的兄弟窗口即使z次序小於本窗口【在本窗口的下面的兄弟窗口】,如果本窗口設置了clipsublings那么下面兄弟窗口就可以顯示出來了(沒有繪制該部分使得下面的遮擋部分兄弟顯示出來了)
9,WS_CLIPCHILDREN

其含義就是,父窗口不對子窗口區域進行繪制。默認情況下父窗口會對子窗口背景是進行繪制的,但是如果父窗口設置了WS_CLIPCHILDREN屬性,父親窗口不在對子窗口背景繪制。

10,WS_CAPTION 

創建該窗口具有標題欄 (意味着WS_BORDER樣式)。 不能與使用WS_DLGFRAME樣式
11,WS_BORDER

創建具有邊框的窗口
12,WS_DLGFRAME

創建一個帶對話框邊框風格的窗口(雙邊框)。這種風格的窗口不能帶標題條
13,WS_VSCROLL

出現垂直滾動條

14,WS_HSCROLL

出現水平滾動條
15,WS_SYSMENU

控制窗口右上角的按鍵(最大化,最小化,關閉)
16,WS_THICKFRAME

可以調節窗口大小,鼠標在窗口邊沿時變成雙向箭頭
17,WS_GROUP

指定一組控件在其中用戶可以從一個控件移到下的箭頭鍵的第一個控件。 使用定義的所有控件WS_GROUP樣式FALSE的第一個控件屬於同一個組之后。 使用下一個控件WS_GROUP樣式啟動下一個組 (即,開始下的一個組結尾)
18,WS_TABSTOP

控件通過其用戶可以通過使用 TAB 鍵移動的任意數量之一指定。 TAB 鍵將用戶移至指定的下一個控件WS_TABSTOP樣式

19,WS_MINIMIZEBOX

控制是否顯示窗口右上角的“最小化”按鈕
20,WS_MAXIMIZEBOX

控制是否顯示窗口右上角的“最大化”按鈕

常用的組合定義

WS_TILED與WS_OVERLAPPED相同

WS_ICONIC與 WS_MINIMIZE相同

WS_SIZEBOX與 WS_THICKFRAME相同

WS_TILEDWINDOW與 WS_OVERLAPPEDWINDOW相同

WS_OVERLAPPEDWINDOW相當於 (WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX)

WS_POPUPWINDOW相當於 (WS_POPUP | WS_BORDER | WS_SYSMENU)

WS_CHILDWINDOW相當於 (WS_CHILD)

 

 

 


免責聲明!

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



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