【Windows編程】系列第二篇:Windows SDK建立基本控制項

來源:互聯網
上載者:User

標籤:

在Win32 SDK環境下,怎麼來建立常用的那些基本控制項呢?我們知道如果用MFC,簡單的拖放即可完成大多數控制項的建立,但是我們既然是用Windows SDK API編程,當然是從根上解決這個問題,實際上MFC的下層也是通過這些API完成的。

實際上控制項也是視窗,只不過是被微軟預先建立好的一種視窗類別,比如button就是一個類名為“BUTTON”的類。既然控制項實際上是視窗,當然也是用CreateWindow或者CreateWindowEx這個函數來完成的,第二個函數除了多一個擴充風格之外,其他完全一樣,下面以主要以CreateWindow為例說明,該函數原型如下(實際上在第一篇已經講過了):

HWND CreateWindow(LPCTSTR lpClassName,

LPCTSTR lpWindowName,

DWORD dwStyle,

int x,   int y,   int nWidth,   int nHeight,

HWND hWndParent,

HMENU hMenu,

HANDLE hInstance,

PVOID lpParam );

lpClassName:控制項的類名

lpWindowName:控制項的名字或者文本

dwStyle:控制項風格

x,y,nWidth,nHeight:控制項的座標和寬高

hWndParent:控制項的父視窗

hMenu:控制項的ID

hInstance:控制項設定為空白

lpParam:控制項設為空白

那麼具體怎麼實現各個基本的控制項呢?下面我們來先依次舉例。

  • 建立標籤/靜態文本

CreateWindow(TEXT("STATIC"), TEXT("Test String"), WS_CHILD|WS_VISIBLE, 10, 10, 80, 20,  hWnd, (HMENU)IDC_STATIC1, NULL, NULL);

  • 建立button

CreateWindow(TEXT("BUTTON"), TEXT("Click Me"), WS_CHILD|WS_VISIBLE, 10, 40, 80, 20, hWnd, (HMENU)IDC_BUTTON1, NULL, NULL);

  • 建立編輯框

CreateWindowEx(WS_EX_CLIENTEDGE, TEXT("EDIT"), NULL, WS_CHILD|WS_VISIBLE|WS_BORDER,  10, 70, 80, 20,  hWnd, (HMENU)IDC_EDIT1, NULL, NULL);

  • 建立Groupbox

CreateWindow(TEXT("BUTTON"), TEXT("frame"), WS_CHILD|WS_VISIBLE|BS_GROUPBOX, 120, 10, 130, 50, hWnd, (HMENU)IDC_FRAME1, NULL, NULL);

  • 建立單選框

CreateWindow(TEXT("BUTTON"), TEXT("radio button"), WS_CHILD|WS_VISIBLE|BS_AUTORADIOBUTTON, 134, 30, 40, 20, hWnd, (HMENU)IDC_MALE, NULL, NULL);

  • 建立複選框

CreateWindow(TEXT("BUTTON"), TEXT("紅色"), WS_CHILD|WS_VISIBLE|BS_CHECKBOX|BS_AUTOCHECKBOX, 120, 70, 54, 20, hWnd, (HMENU)IDC_CKBRED, NULL, NULL);

  • 建立列表框

CreateWindowEx(WS_EX_CLIENTEDGE, TEXT("LISTBOX"), NULL, WS_CHILD|WS_VISIBLE|LBS_STANDARD, 10, 100, 80, 90, hWnd, (HMENU)IDC_LISTBOX1, NULL, NULL);

  • 建立組合框

CreateWindow(TEXT("COMBOBOX"), NULL, WS_CHILD|WS_VISIBLE|WS_VSCROLL|CBS_AUTOHSCROLL|CBS_DROPDOWNLIST,  120, 100, 100, 90, hWnd, (HMENU)IDC_CB1, NULL, NULL);

  • 建立捲軸

CreateWindow(TEXT("SCROLLBAR"), NULL, WS_CHILD|WS_VISIBLE|SBS_HORZ, 10, 200, 200, 20, hWnd, (HMENU)IDC_SCB1, NULL, NULL);

以上建立各個控制項都很差傻瓜化,你可以複製下來改改座標、文本、風格、ID等就可以按照你的需要建立了。

下面我們就來實戰一下,把這些常用的控制項在程式中實現,下面我們來實現一個完整的windows程式,程式中包含了這些常用的控制項和更多的用法。

/* 常用控制項執行個體 */

#include <windows.h>

#define IDC_STATIC1 1001 #define IDC_BUTTON1 1002 #define IDC_EDIT1   1003 #define IDC_FRAME1  1004 #define IDC_MALE    2001 #define IDC_FEMALE  2002 #define IDC_LISTBOX1 1005 #define IDC_CB1     1006 #define IDC_CKBRED  1007 #define IDC_CKBGRN  1008 #define IDC_CKBBLU  1009 #define IDC_SCB1    1010 #define IDC_SCB2    1011

static TCHAR szAppName[] = TEXT("HelloWin32"); static LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { HWND     hWnd; MSG      msg; WNDCLASS wndclass;

wndclass.style         = CS_HREDRAW | CS_VREDRAW; wndclass.lpfnWndProc   = WndProc; wndclass.cbClsExtra    = 0; wndclass.cbWndExtra    = 0; wndclass.hInstance     = hInstance; wndclass.hIcon         = LoadIcon(NULL, IDI_APPLICATION); wndclass.hCursor       = LoadCursor(NULL, IDC_ARROW); wndclass.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH); wndclass.lpszMenuName  = NULL; wndclass.lpszClassName = szAppName;

if (!RegisterClass(&wndclass)) { MessageBox (NULL, TEXT("This program requires Windows NT!"), szAppName, MB_ICONERROR); return 0; }

hWnd = CreateWindow(szAppName,                  // window class name szAppName,                 // window caption WS_OVERLAPPEDWINDOW,        // window style CW_USEDEFAULT,              // initial x position CW_USEDEFAULT,              // initial y position 400,              // initial x size 300,              // initial y size NULL,                       // parent window handle NULL,                       // window menu handle hInstance,                  // program instance handle NULL);                     // creation parameters

ShowWindow(hWnd, iCmdShow); UpdateWindow(hWnd);

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

return msg.wParam; }

static LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { HWND hCtrl;

switch (message) { case WM_CREATE: CreateWindow(TEXT("STATIC"), TEXT("Test String"), WS_CHILD|WS_VISIBLE, 10, 10, 80, 20, hWnd, (HMENU)IDC_STATIC1, NULL, NULL);

CreateWindow(TEXT("BUTTON"), TEXT("Click Me"), WS_CHILD|WS_VISIBLE, 10, 40, 80, 20, hWnd, (HMENU)IDC_BUTTON1, NULL, NULL); CreateWindowEx(WS_EX_CLIENTEDGE, TEXT("EDIT"), NULL, WS_CHILD|WS_VISIBLE|WS_BORDER,  10, 70, 80, 20, hWnd, (HMENU)IDC_EDIT1, NULL, NULL);

CreateWindow(TEXT("BUTTON"), TEXT("性別"), WS_CHILD|WS_VISIBLE|BS_GROUPBOX, 120, 10, 130, 50, hWnd, (HMENU)IDC_FRAME1, NULL, NULL); CreateWindow(TEXT("BUTTON"), TEXT("男"), WS_CHILD|WS_VISIBLE|BS_AUTORADIOBUTTON, 134, 30, 40, 20, hWnd, (HMENU)IDC_MALE, NULL, NULL); CreateWindow(TEXT("BUTTON"), TEXT("女"), WS_CHILD|WS_VISIBLE|BS_AUTORADIOBUTTON, 194, 30, 40, 20, hWnd, (HMENU)IDC_FEMALE, NULL, NULL);

CreateWindow(TEXT("BUTTON"), TEXT("紅色"), WS_CHILD|WS_VISIBLE|BS_CHECKBOX|BS_AUTOCHECKBOX, 120, 70, 54, 20, hWnd, (HMENU)IDC_CKBRED, NULL, NULL); CreateWindow(TEXT("BUTTON"), TEXT("綠色"), WS_CHILD|WS_VISIBLE|BS_CHECKBOX|BS_AUTOCHECKBOX, 180, 70, 54, 20, hWnd, (HMENU)IDC_CKBGRN, NULL, NULL); CreateWindow(TEXT("BUTTON"), TEXT("藍色"), WS_CHILD|WS_VISIBLE|BS_CHECKBOX|BS_AUTOCHECKBOX, 240, 70, 54, 20, hWnd, (HMENU)IDC_CKBBLU, NULL, NULL);

hCtrl = CreateWindowEx(WS_EX_CLIENTEDGE, TEXT("LISTBOX"), NULL, WS_CHILD|WS_VISIBLE|LBS_STANDARD, 10, 100, 80, 90, hWnd, (HMENU)IDC_LISTBOX1, NULL, NULL); SendMessage(hCtrl, LB_ADDSTRING, 0, (LPARAM)TEXT("list str1")); SendMessage(hCtrl, LB_ADDSTRING, 0, (LPARAM)TEXT("list str2")); SendMessage(hCtrl, LB_ADDSTRING, 0, (LPARAM)TEXT("list str3")); SendMessage(hCtrl, LB_ADDSTRING, 0, (LPARAM)TEXT("list str4"));

hCtrl = CreateWindow(TEXT("COMBOBOX"), NULL, WS_CHILD|WS_VISIBLE|WS_VSCROLL|CBS_AUTOHSCROLL|CBS_DROPDOWNLIST, 120, 100, 100, 90, hWnd, (HMENU)IDC_CB1, NULL, NULL); SendMessage(hCtrl, CB_ADDSTRING, 0, (LPARAM)TEXT("comb str1")); SendMessage(hCtrl, CB_ADDSTRING, 0, (LPARAM)TEXT("comb str2")); SendMessage(hCtrl, CB_ADDSTRING, 0, (LPARAM)TEXT("comb str3")); SendMessage(hCtrl, CB_ADDSTRING, 0, (LPARAM)TEXT("comb str4")); SendMessage(hCtrl, CB_SETCURSEL, 1, 0);

CreateWindow(TEXT("SCROLLBAR"), NULL, WS_CHILD|WS_VISIBLE|SBS_HORZ, 10, 200, 200, 20, hWnd, (HMENU)IDC_SCB1, NULL, NULL); CreateWindow(TEXT("SCROLLBAR"), NULL, WS_CHILD|WS_VISIBLE|SBS_VERT, 240, 100, 20, 120, hWnd, (HMENU)IDC_SCB2, NULL, NULL); return 0;

case WM_COMMAND: { HWND hwndTmp; int wmId = LOWORD(wParam); switch (wmId) { case IDC_BUTTON1: hwndTmp = GetDlgItem(hWnd, IDC_STATIC1); SetWindowText(hwndTmp, TEXT("New Text")); MessageBox(hWnd, TEXT("Text Changed!"), TEXT("info"), MB_OK); break; } } return 0;

case WM_CTLCOLORSTATIC: { HDC hdc = (HDC)wParam; SetTextColor(hdc, RGB(0xFF, 0x00, 0x00)); } return (BOOL)((HBRUSH)GetStockObject(NULL_BRUSH));

case WM_DESTROY: PostQuitMessage(0); return 0; }

return DefWindowProc (hWnd, message, wParam, lParam); }

編譯一下運行,結果如下:

怎麼樣,是不是很簡單,雖然我們的控制項建立比MFC麻煩一下,但是我們是從“根”上來解決問題的,感覺是不一樣的!有了這些基本的用法,你就可以構建更加複製的Windows介面了。趕快去試試吧。

轉載請註明原地址:http://www.coderonline.net/?p=680

 

身為一名IT技術人員磨練自己的技術是必不可少的,歡迎加入QQ群:程式員互動聯盟(254241126),可以與大牛線上隨時討論自己感興趣的話題,大牛每天為你奉獻一篇技術原創,讓自己用最少的時間學到很多東西,我在程式員互動聯盟期待您的加入:)

如果大家想更深入瞭解更多的編程知識,請關注我們的公眾號,及時溝通,這裡有各種大牛幫你解決問題。公眾平台:程式員互動聯盟(coder_online)。

歡迎加入我們的QQ群:程式員互動聯盟(254241126)

【Windows編程】系列第二篇:Windows SDK建立基本控制項

聯繫我們

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