AdjustWindowRect 與 SetWindowPos

來源:互聯網
上載者:User

標籤:des   style   c   class   blog   code   

這兩個函數經常一起使用,所以放到一起講:

1 AdjustWindowRect

    函數功能:該函數依據所需客戶矩形的大小,計算需要的視窗矩形的大小。計算出的視窗矩形隨後可以傳遞給CreateWindow函數,用於建立一個客戶區所需大小的視窗。

    函數原型:BOOL AdjustWindowRect(LPRECT lpRect ,DWORD dwStyle,BOOL bMENU);

    參數:

    lpRect:指向RECT結構的指標,該結構包含所需用戶端區域的左上方和右下角的座標。函數返回時,該結構容納所需用戶端區域的視窗的左上方和右下角的座標。

    dwStyle:指定將被計算尺寸的視窗的視窗風格。

    bMenu:指示視窗是否有菜單。

    傳回值:如果函數成功,傳回值為非零;如果函數失敗,傳回值為零。擷取錯誤資訊,參看GetLastError。

    備忘:客戶矩形是指完全包含一個用戶端區域的最小矩形;視窗矩形是指完全包含一個視窗的最小矩形,該視窗包含客戶區與非客戶區。

    當一個菜單條下拉出兩行或更多行時,AdjustWindowRect函數不增加額外的空間。

 

2 SetWindowPos

    函數功能:該函數改變一個子視窗,彈出式視窗式頂層視窗的尺寸,位置和Z序。子視窗,彈出式視窗,及頂層視窗根據它們在螢幕上出現的順序排序、頂層視窗設定的層級最高,並且被設定為Z序的第一個視窗。

    函數原型:BOOL SetWindowPos(HWN hWnd,HWND hWndlnsertAfter,int X,int Y,int cx,int cy,UNIT.Flags);

    參數:

    hWnd:視窗控制代碼。

    hWndlnsertAfter:在z序中的位於被置位的視窗前的視窗控制代碼。該參數必須為一個視窗控制代碼,或下列值之一:

    HWND_BOTTOM:將視窗置於Z序的底部。如果參數hWnd標識了一個頂層視窗,則視窗失去頂級位置,並且被置在其他視窗的底部。

    HWND_DOTTOPMOST:將視窗置於所有非頂層視窗之上(即在所有頂層視窗之後)。如果視窗己經是非頂層視窗則該標誌不起作用。

    HWND_TOP:將視窗置於Z序的頂部。

    HWND_TOPMOST:將視窗置於所有非頂層視窗之上。即使視窗未被啟用視窗也將保持頂級位置。

    查g看該參數的使用方法,請看說明部分。

    x:以客戶座標指定視窗新位置的左邊界。

    Y:以客戶座標指定視窗新位置的頂邊界。

    cx:以像素指定視窗的新的寬度。

    cy:以像素指定視窗的新的高度。

    uFlags:視窗尺寸和定位的標誌。該參數可以是下列值的組合:

    SWP_ASNCWINDOWPOS:如果調用進程不擁有視窗,系統會向擁有視窗的線程發出需求。這就防止調用線程在其他線程處理需求的時候發生死結。

    SWP_DEFERERASE:防止產生WM_SYNCPAINT訊息。

    SWP_DRAWFRAME:在視窗周圍畫一個邊框(定義在視窗類別描述中)。

    SWP_FRAMECHANGED:給視窗發送WM_NCCALCSIZE訊息,即使視窗尺寸沒有改變也會發送該訊息。如果未指定這個標誌,只有在改變了視窗尺寸時才發送WM_NCCALCSIZE。

    SWP_HIDEWINDOW;隱藏視窗。

    SWP_NOACTIVATE:不啟用視窗。如果未設定標誌,則視窗被啟用,並被設定到其他最進階視窗或非最進階組的頂部(根據參數hWndlnsertAfter設定)。

    SWP_NOCOPYBITS:清除客戶區的所有內容。如果未設定該標誌,客戶區的有效內容被儲存並且在視窗尺寸更新和重定位後拷貝回客戶區。

    SWP_NOMOVE:維持當前位置(忽略X和Y參數)。

    SWP_NOOWNERZORDER:不改變z序中的所有者視窗的位置。

    SWP_NOREDRAW:不重畫改變的內容。如果設定了這個標誌,則不發生任何重畫動作。適用於客戶區和非客戶區(包括標題列和捲軸)和任何由於窗回移動而露出的父視窗的所有部分。如果設定了這個標誌,應用程式必須明確地使視窗無效並區重畫視窗的任何部分和父視窗需要重畫的部分。

    SWP_NOREPOSITION;與SWP_NOOWNERZORDER標誌相同。

    SWP_NOSENDCHANGING:防止視窗接收WM_WINDOWPOSCHANGING訊息。

    SWP_NOSIZE:維持當前尺寸(忽略cx和Cy參數)。

    SWP_NOZORDER:維持當前Z序(忽略hWndlnsertAfter參數)。

    SWP_SHOWWINDOW:顯示視窗。

    傳回值:如果函數成功,傳回值為非零;如果函數失敗,傳回值為零。若想獲得更多錯誤訊息,請調用GetLastError函數。

    備忘:如果設定了SWP_SHOWWINDOW和SWP_HIDEWINDOW標誌,則視窗不能被移動和改變大小。如果使用SetWindowLoog改變了視窗的某些資料,則必須調用函數SetWindowPos來作真正的改變。使用下列的組合標誌:SWP_NOMOVEISWP_NOSIZEISWP_FRAMECHANGED。

    有兩種方法將視窗設為最頂層視窗:一種是將參數hWndlnsertAfter設定為HWND_TOPMOST並確保沒有設定SWP_NOZORDER標誌;另一種是設定視窗在Z序中的位置以使其在其他存在的視窗之上。當一個視窗被置為最頂層視窗時,屬於它的所有視窗均為最頂層視窗,而它的所有者的z序並不改變。

    如果HWND_TOPMOST和HWND_NOTOPMOST標誌均未指定,即應用程式要求視窗在啟用的同時改變其在Z序中的位置時,在參數hWndinsertAfter中指定的值只有在下列條件中才使用:

    在hWndlnsertAfter參數中沒有設定HWND_NOTOPMOST和HWND_TOPMOST標誌。

    由hWnd參數標識的視窗不是啟用視窗。

    如果未將一個非啟用視窗設定到z序的頂端,應用程式不能啟用該視窗。應用程式可以無任何限制地改變被啟用視窗在Z序中的位置,或啟用一個視窗並將其移到最進階視窗的頂部或非最進階視窗的頂部。

    如果一個頂層視窗被重定位到z序的底部(HWND_BOTTOM)或在任何非最高序的視窗之後,該視窗就不再是最頂層視窗。當一個最頂層視窗被置為非最頂級,則它的所有者視窗和所屬者視窗均為非最頂層視窗。

    一個非最頂端視窗可以擁有一個最頂端視窗,但反之則不可以。任何屬於頂層視窗的視窗(例如一個對話方塊)本身就被置為頂層視窗,以確保所有被屬視窗都在它們的所有者之上。

    如果應用程式不在前台,但應該位於前台,就應調用SetForegroundWindow函數來設定。

    Windows CE:如果這是一個可見的頂層視窗,並且未指定SWP_NOACTIVATE標誌,則這個函數將啟用視窗、如果這是當前的啟用視窗,並且指定了SWP_NOACTIVATE或SWP_HIDEWINDOW標誌,則啟用另外一個可見的頂層視窗。

    當在這個函數中的nFlags參數裡指定了SWP_FRAMECHANGED標誌時,WindowsCE重畫視窗的整個非客戶區,這可能會改變客戶區的大小。這也是重新計算客戶區的唯一途徑,也是通過調用SetwindowLong函數改變視窗風格後通常使用的方法。

    SetWindowPos將使WM_WINDOWPOSCHANGED訊息向視窗發送,在這個訊息中傳遞的標誌與傳遞給函數的相同。這個函數不傳遞其他訊息。

    Windows CE 1.0不支援在hWndlnsertAber參數中的HWND_TOPMOST和HWND_NOTOPMOST常量。

    Windows CE1.0不支援在fuFags參數中的SWP_DRAWFRAME和SWP_NOCOPYBITS標誌。

 

例如,下面建立的視窗位於最頂層,且指定客戶區大小

 

 

  1 #include <windows.h>   2   3   4 HINSTANCE g_hIns;   5 HWND g_hWnd;   6   7   8 LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);   9  10  11 int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int iCmdShow)  12 {  13     g_hIns=hInstance;  14  15     static TCHAR szAppName[]=TEXT("HelloWin");  16     HWND hWnd;  17     MSG msg;  18     WNDCLASS wndClass;  19  20     wndClass.style=CS_HREDRAW|CS_VREDRAW;  21     wndClass.lpfnWndProc=WndProc;  22     wndClass.cbClsExtra=0;  23     wndClass.cbWndExtra=0;  24     wndClass.hInstance=hInstance;  25     wndClass.hIcon=LoadIcon(NULL,IDI_APPLICATION);  26     wndClass.hCursor=LoadCursor(NULL,IDC_ARROW);  27     wndClass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);  28     wndClass.lpszMenuName=NULL;  29     wndClass.lpszClassName=szAppName;  30  31     if(!RegisterClass(&wndClass))  32     {  33         MessageBox(NULL,TEXT("error"),szAppName,MB_ICONERROR|MB_OK);  34         return 0;  35     }  36  37     hWnd=CreateWindow(szAppName,TEXT("The hello program"),WS_OVERLAPPEDWINDOW,  38         CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInstance,NULL);  39  40       41  42     int iReturn;  43  44     //也可以放在此  45  46     ShowWindow(hWnd,iCmdShow);  47  48     UpdateWindow(hWnd);  49  50  51  52  53     while(GetMessage(&msg,hWnd,0,0))  54     {  55         TranslateMessage(&msg);  56         DispatchMessage(&msg);  57     }  58  59     return msg.wParam;  60 }  61  62 LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)  63 {  64     static HDC hdc;  65     static HDC hBitmapDC;  66  67     PAINTSTRUCT ps;  68  69     int iReturn;  70  71     static RECT rect = {0,0,400,200};  72  73     switch (message)  74     {  75     case WM_CREATE:  76         iReturn = AdjustWindowRect(&rect,WS_OVERLAPPEDWINDOW,true);  77  78         SetWindowPos(hWnd,HWND_TOPMOST,100,100,rect.right-rect.left,rect.bottom-rect.top, SWP_NOMOVE);//頂層  79           80         break;  81  82     case   WM_PAINT :  83         hdc=BeginPaint(hWnd,&ps);  84  85         EndPaint (hWnd, &ps) ;  86  87         break;  88  89     case WM_DESTROY :  90         PostQuitMessage (0) ;  91  92         break ;  93  94     default:  95         return DefWindowProc (hWnd, message, wParam, lParam) ;  96  97     }  98  99     return 1; 100 101 }

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.