win32 API编程之常用控件

2024-07-06

一、按钮控件

二、美化按钮

三、windows资源文件.rc

四、资源相关函数

五、静态文本框

六、美化静态文本框

七、编辑框

八、美化编辑框

九、列表框

十、美化列表框

十一、组合框

十二、滚动条

十三、美化滚动条

一、按钮控件

1)注意事项

创建按钮一般在WM_CREATE消息中;

系统注册的按钮类名是“button”,不区分大小写。

WS_CHILD:控件是放在我们的窗口上的,自然要作为窗口的子窗口

WS_CHILDWINDOW也一样,为了节约几个字母,用WS_CHILD吧。

WS_VISIBLE:设置可见。

创建窗口函数讲解

HWND WINAPI CreateWindow( 类名, 显示内容, 风格, nt x, int y, int nWidth, int nHeight, 父窗口, 控件ID, HINSTANCE hInstance, LPVOID lpParam );

2)按钮样式

3)获取单选按钮与复选按钮的状态

4)代码实例

#include

#include //Button_GetCheck的头文件

#include

//自定义的窗口过程

LRESULT CALLBACK MyWindowProc(HWND hWnd, UINT Msg,

WPARAM wParam, LPARAM lParam)

{

switch (Msg)

{

case WM_DESTROY:

PostQuitMessage(0);//可以使GetMessage返回0

return 0;

case WM_CREATE:

{

LPCREATESTRUCT pcs = (LPCREATESTRUCT)lParam;

//创建控件或者子窗口

//普通按钮BS_PUSHBUTTON

HWND hBtn=CreateWindow(L"button", L"普通按钮", WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON ,30, 30, 80, 30, hWnd,

(HMENU)1000,//控件ID

pcs->hInstance, NULL);

//单选按钮

HWND hBtn1 = CreateWindow(L"button", L"单选按钮", WS_CHILD | WS_VISIBLE | BS_AUTORADIOBUTTON, 30, 70, 80, 30, hWnd,

(HMENU)1001,//控件ID

pcs->hInstance, NULL);

//复选按钮

HWND hBtn2 = CreateWindow(L"button", L"复选按钮", WS_CHILD | WS_VISIBLE | BS_AUTOCHECKBOX, 30, 110, 80, 30, hWnd,

(HMENU)1002,//控件ID

pcs->hInstance, NULL);

return 0;

}

case WM_COMMAND:

{

WORD id = LOWORD(wParam);

WORD code= HIWORD(wParam);

HWND hCtrl = (HWND)lParam;

if (id == 1000 && code == BN_CLICKED)

{

MessageBox(hWnd, L"普通按钮被单击!", L"提示",MB_OK);

}

else if (id == 1001)

{

MessageBox(hWnd, L"单选按钮被单击!", L"提示", MB_OK);

if (SendMessage(hCtrl, BM_GETCHECK, 0, 0) == BST_CHECKED)

{

MessageBox(hWnd, L"被选中!", L"提示", MB_OK);

}

else if (SendMessage(hCtrl, BM_GETCHECK, 0, 0) == BST_UNCHECKED)

{

MessageBox(hWnd, L"没选中!", L"提示", MB_OK);

}

}

else if (id == 1002)

{

MessageBox(hWnd, L"复选按钮被单击!", L"提示", MB_OK);

/*

if (SendMessage(hCtrl, BM_GETCHECK, 0, 0) == BST_CHECKED)

{

MessageBox(hWnd, L"被选中!", L"提示", MB_OK);

}

else if (SendMessage(hCtrl, BM_GETCHECK, 0, 0) == BST_UNCHECKED)

{

MessageBox(hWnd, L"没选中!", L"提示", MB_OK);

}

*/

//简写形式((int)(DWORD)SNDMSG((hwndCtl), BM_GETCHECK, 0L, 0L))

if (Button_GetCheck(hCtrl) == BST_CHECKED)

{

MessageBox(hWnd, L"被选中!", L"提示", MB_OK);

}

else if (Button_GetCheck(hCtrl) == BST_UNCHECKED)

{

MessageBox(hWnd, L"没选中!", L"提示", MB_OK);

}

}

}break;

default:

break;

}

return DefWindowProc(hWnd, Msg, wParam, lParam);

}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,

LPSTR lpCmdLine, int nShowCmd)

{

//1.注册窗口类

WNDCLASS wnd;

wnd.cbClsExtra = 0;

wnd.cbWndExtra = 0;

wnd.hbrBackground = (HBRUSH)(GetStockObject(GRAY_BRUSH));//背景色

wnd.hCursor = LoadCursor(NULL, IDC_ARROW);//光标

wnd.hIcon = LoadIcon(NULL, IDI_APPLICATION);//图标

//wnd.lpfnWndProc = DefWindowProc;//默认窗口过程函数,用于处理消息

wnd.lpfnWndProc = MyWindowProc;//自定义的窗口过程函数

wnd.lpszClassName = L"MrHuang";//窗口类名

wnd.lpszMenuName = NULL;//菜单资源名称

wnd.style = CS_HREDRAW | CS_DBLCLKS;//窗口类、样式

wnd.hInstance = hInstance;//实例句柄

RegisterClass(&wnd);

//创建窗口(返回之前发送WM_CREATE)

HWND hWnd = CreateWindow(L"MrHuang", L"第一个窗口程序",

WS_OVERLAPPEDWINDOW, 100, 100, 300, 300, NULL, NULL, hInstance, NULL);

//显示窗口

ShowWindow(hWnd, nShowCmd);

//更新窗口(发送WM_PAINT)

UpdateWindow(hWnd);

//消息循环(收到WM_QUIT消息退出)

MSG msg;

while (GetMessage(&msg, NULL, 0, 0))

{

TranslateMessage(&msg);//翻译消息

DispatchMessage(&msg);//分发消息到窗口过程

}

}

二、美化按钮

代码实例

#include

#include

//自定义的窗口过程

LRESULT CALLBACK MyWindowProc(HWND hWnd, UINT Msg,

WPARAM wParam, LPARAM lParam)

{

switch (Msg)

{

case WM_DESTROY:

PostQuitMessage(0);//可以使GetMessage返回0

return 0;

case WM_CREATE:

{

LPCREATESTRUCT pcs = (LPCREATESTRUCT)lParam;

//创建位图按钮

HWND hBtn = CreateWindow(L"BuTtOn" /*不区分大小写*/,

L"XXX", WS_CHILD | WS_VISIBLE | BS_BITMAP,//指定为图片

30, 30, 217, 46, hWnd, (HMENU)1000, pcs->hInstance, NULL);

//加载位图

HBITMAP hBmp=(HBITMAP)LoadImage(NULL, L"C:\\Users\\35497\\Desktop\\code\\016\\Debug\\btn1.bmp",

IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);

//向控件发送BM_SETIMAGE消息设置按钮图片

LRESULT ret=SendMessage(hBtn, BM_SETIMAGE, (WPARAM)IMAGE_BITMAP, (LPARAM)hBmp);

return 0;

}

case WM_COMMAND:

{

WORD id = LOWORD(wParam);

WORD code = HIWORD(wParam);

HWND hCtrl = (HWND)lParam;

if (id == 1000 && code == BN_CLICKED)

{

MessageBox(hWnd, L"普通按钮被单击!", L"提示", MB_OK);

}

}break;

default:

break;

}

return DefWindowProc(hWnd, Msg, wParam, lParam);

}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,

LPSTR lpCmdLine, int nShowCmd)

{

//1.注册窗口类

WNDCLASS wnd;

wnd.cbClsExtra = 0;

wnd.cbWndExtra = 0;

wnd.hbrBackground = (HBRUSH)(GetStockObject(GRAY_BRUSH));//背景色

wnd.hCursor = LoadCursor(NULL, IDC_ARROW);//光标

wnd.hIcon = LoadIcon(NULL, IDI_APPLICATION);//图标

//wnd.lpfnWndProc = DefWindowProc;//默认窗口过程函数,用于处理消息

wnd.lpfnWndProc = MyWindowProc;//自定义的窗口过程函数

wnd.lpszClassName = L"MrHuang";//窗口类名

wnd.lpszMenuName = NULL;//菜单资源名称

wnd.style = CS_HREDRAW | CS_DBLCLKS;//窗口类、样式

wnd.hInstance = hInstance;//实例句柄

RegisterClass(&wnd);

//创建窗口(返回之前发送WM_CREATE)

HWND hWnd = CreateWindow(L"MrHuang", L"第一个窗口程序",

WS_OVERLAPPEDWINDOW, 100, 100, 300, 300, NULL, NULL, hInstance, NULL);

//显示窗口

ShowWindow(hWnd, nShowCmd);

//更新窗口(发送WM_PAINT)

UpdateWindow(hWnd);

//消息循环(收到WM_QUIT消息退出)

MSG msg;

while (GetMessage(&msg, NULL, 0, 0))

{

TranslateMessage(&msg);//翻译消息

DispatchMessage(&msg);//分发消息到窗口过程

}

}

三、windows资源文件.rc

1)创建步骤

四、资源相关函数

1)相关函数

2)LoadBitmap函数

3)LoadCursor函数

4)代码实例

#include

#include

#include"resource.h"

//自定义的窗口过程

LRESULT CALLBACK MyWindowProc(HWND hWnd, UINT Msg,

WPARAM wParam, LPARAM lParam)

{

switch (Msg)

{

case WM_DESTROY:

PostQuitMessage(0);//可以使GetMessage返回0

return 0;

case WM_CREATE:

{

LPCREATESTRUCT pcs = (LPCREATESTRUCT)lParam;

//创建位图按钮

HWND hBtn = CreateWindow(L"BuTtOn" /*不区分大小写*/,

L"XXX", WS_CHILD | WS_VISIBLE | BS_BITMAP,//指定为图片

30, 30, 217, 46, hWnd, (HMENU)1000, pcs->hInstance, NULL);

//LoadImage加载位图

//HBITMAP hBmp=(HBITMAP)LoadImage(NULL, L"C:\\Users\\35497\\Desktop\\code\\016\\Debug\\btn1.bmp",

// IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);

//采用LoadBitmap加载位图资源(必须在rc文件中定义)

HBITMAP hBmp= LoadBitmap(pcs->hInstance, MAKEINTRESOURCE(IDB_BITMAP1) );

//向控件发送BM_SETIMAGE消息设置按钮图片

LRESULT ret=SendMessage(hBtn, BM_SETIMAGE, (WPARAM)IMAGE_BITMAP, (LPARAM)hBmp);

return 0;

}

case WM_COMMAND:

{

WORD id = LOWORD(wParam);

WORD code = HIWORD(wParam);

HWND hCtrl = (HWND)lParam;

if (id == 1000 && code == BN_CLICKED)

{

MessageBox(hWnd, L"普通按钮被单击!", L"提示", MB_OK);

}

}break;

default:

break;

}

return DefWindowProc(hWnd, Msg, wParam, lParam);

}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,

LPSTR lpCmdLine, int nShowCmd)

{

//1.注册窗口类

WNDCLASS wnd;

wnd.cbClsExtra = 0;

wnd.cbWndExtra = 0;

wnd.hbrBackground = (HBRUSH)(GetStockObject(GRAY_BRUSH));//背景色

//加载系统光标,第一个参数为NULL

//wnd.hCursor = LoadCursor(NULL, IDC_ARROW);

//加载资源中的光标

wnd.hCursor = LoadCursor(hInstance, MAKEINTRESOURCE(IDC_CURSOR2));

//加载系统图标,第一个参数为NULL

//wnd.hIcon = LoadIcon(NULL, IDI_APPLICATION);

//加载资源中的图标

wnd.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ICON2));

//wnd.lpfnWndProc = DefWindowProc;//默认窗口过程函数,用于处理消息

wnd.lpfnWndProc = MyWindowProc;//自定义的窗口过程函数

wnd.lpszClassName = L"MrHuang";//窗口类名

wnd.lpszMenuName = NULL;//菜单资源名称

wnd.style = CS_HREDRAW | CS_DBLCLKS;//窗口类、样式

wnd.hInstance = hInstance;//实例句柄

RegisterClass(&wnd);

//加载字符串资源

TCHAR buf[64] = {0};

LoadString(hInstance, IDS_STRING1, buf, sizeof(buf));

LoadString(GetModuleHandle(NULL), IDS_STRING2, buf, sizeof(buf));

//创建窗口(返回之前发送WM_CREATE)

HWND hWnd = CreateWindow(L"MrHuang", buf,

WS_OVERLAPPEDWINDOW, 100, 100, 300, 300, NULL, NULL, hInstance, NULL);

//显示窗口

ShowWindow(hWnd, nShowCmd);

//更新窗口(发送WM_PAINT)

UpdateWindow(hWnd);

//消息循环(收到WM_QUIT消息退出)

MSG msg;

while (GetMessage(&msg, NULL, 0, 0))

{

TranslateMessage(&msg);//翻译消息

DispatchMessage(&msg);//分发消息到窗口过程

}

}

五、静态文本框

1)创建静态文本

2)静态控件样式

3)设置文本内容SetWindowText

4)可以向静态文本框发送消息来设置图标、位图等

5)代码实例

#include

#include"resource.h"

#include

//自定义的窗口过程

LRESULT CALLBACK MyWindowProc(HWND hWnd, UINT Msg,

WPARAM wParam, LPARAM lParam)

{

switch (Msg)

{

case WM_DESTROY:

PostQuitMessage(0);//可以使GetMessage返回0

return 0;

case WM_CREATE:

{

LPCREATESTRUCT pcs = (LPCREATESTRUCT)lParam;

//静态文本控件

HWND hStatic= CreateWindow(L"Static", L"这是一个静态文本", WS_CHILD | WS_VISIBLE |WS_BORDER|SS_BITMAP|SS_NOTIFY,

30, 30,200, 30, hWnd, (HMENU)111, pcs->hInstance, NULL);

//更改窗口标题

SetWindowText(hWnd, L"新窗口标题");

//设置控件(子窗口)内容

SetWindowText(hStatic, L"更改后的内容!");

//加载位图

HBITMAP hBmp= LoadBitmap(pcs->hInstance, MAKEINTRESOURCE(IDB_BITMAP1));

//向控件发送STM_SETIMAGE消息设置静态控件的位图

SendMessage(hStatic, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM)hBmp);

return 0;

}

case WM_COMMAND:

{

WORD id = LOWORD(wParam);//控件ID

WORD code = HIWORD(wParam);//消息类型

HWND hCtrl = (HWND)lParam;//窗口句柄

//父窗口接收到子控件发的消息

if (id == 111 && code == STN_CLICKED)

{

MessageBox(NULL, L"静态文本被点击!", L"提示", MB_OK);

}

}break;

default:

break;

}

return DefWindowProc(hWnd, Msg, wParam, lParam);

}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,

LPSTR lpCmdLine, int nShowCmd)

{

//1.注册窗口类

WNDCLASS wnd;

wnd.cbClsExtra = 0;

wnd.cbWndExtra = 0;

wnd.hbrBackground = (HBRUSH)(GetStockObject(GRAY_BRUSH));//背景色

wnd.hCursor = LoadCursor(NULL, IDC_ARROW);//光标

wnd.hIcon = LoadIcon(NULL, IDI_APPLICATION);//图标

//wnd.lpfnWndProc = DefWindowProc;//默认窗口过程函数,用于处理消息

wnd.lpfnWndProc = MyWindowProc;//自定义的窗口过程函数

wnd.lpszClassName = L"MrHuang";//窗口类名

wnd.lpszMenuName = NULL;//菜单资源名称

wnd.style = CS_HREDRAW | CS_DBLCLKS;//窗口类、样式

wnd.hInstance = hInstance;//实例句柄

RegisterClass(&wnd);

//创建窗口(返回之前发送WM_CREATE)

HWND hWnd = CreateWindow(L"MrHuang", L"第一个窗口程序",

WS_OVERLAPPEDWINDOW, 100, 100, 300, 300, NULL, NULL, hInstance, NULL);

//显示窗口

ShowWindow(hWnd, nShowCmd);

//更新窗口(发送WM_PAINT)

UpdateWindow(hWnd);

//消息循环(收到WM_QUIT消息退出)

MSG msg;

while (GetMessage(&msg, NULL, 0, 0))

{

TranslateMessage(&msg);//翻译消息

DispatchMessage(&msg);//分发消息到窗口过程

}

}

六、美化静态文本

1)在WM_CTLCOLORSTATIC消息中美化静态文本。

3)GetWindowLong()函数可以获取控件的信息。

2)代码实例

#include

#include

//自定义的窗口过程

LRESULT CALLBACK MyWindowProc(HWND hWnd, UINT Msg,

WPARAM wParam, LPARAM lParam)

{

switch (Msg)

{

case WM_DESTROY:

PostQuitMessage(0);//可以使GetMessage返回0

return 0;

case WM_CREATE:

{

LPCREATESTRUCT pcs = (LPCREATESTRUCT)lParam;

//静态文本控件

HWND hStatic = CreateWindow(L"Static", L"这是一个静态文本", WS_CHILD | WS_VISIBLE ,

30, 30, 200, 30, hWnd, (HMENU)111, pcs->hInstance, NULL);

//静态文本控件

HWND hStatic2 = CreateWindow(L"Static", L"这是二个静态文本", WS_CHILD | WS_VISIBLE,

30, 80, 200, 30, hWnd, (HMENU)222, pcs->hInstance, NULL);

return 0;

}

//静态文本控件绘制之前发送的消息

case WM_CTLCOLORSTATIC:

{

HDC hdc = (HDC)wParam;//设备上下文的句柄

HWND hStatic = (HWND)lParam;//控件句柄

UINT CtrlID = GetWindowLong(hStatic, GWL_ID); //获取控件ID

if(CtrlID ==111) //当控件ID=111时才美化

{

SetTextColor(hdc, RGB(255, 0, 0));//设置文字为红色

//SetBkColor(hdc, RGB(0, 255, 0));//设置文字的背景色

SetBkMode(hdc, TRANSPARENT);//设置文字背景透明

//return (LRESULT)GetStockObject(BLACK_BRUSH);//返回系统画笔

return (LRESULT)CreateSolidBrush(RGB(0, 0, 255)); //控件的背景色,自己创建的画刷,需要释放

}

else if (CtrlID == 222)

{

SetTextColor(hdc, RGB(0, 255, 0));//设置文字为红色

SetBkColor(hdc, RGB(255, 255, 0));//设置文字的背景色

return (LRESULT)GetStockObject(BLACK_BRUSH);//返回系统画笔

}

}break;

case WM_COMMAND:

{

WORD id = LOWORD(wParam);//控件ID

WORD code = HIWORD(wParam);//消息类型

HWND hCtrl = (HWND)lParam;//窗口句柄

//父窗口接收到子控件发的消息

if (id == 111 && code == STN_CLICKED)

{

MessageBox(NULL, L"静态文本被点击!", L"提示", MB_OK);

}

}break;

default:

break;

}

return DefWindowProc(hWnd, Msg, wParam, lParam);

}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,

LPSTR lpCmdLine, int nShowCmd)

{

//1.注册窗口类

WNDCLASS wnd;

wnd.cbClsExtra = 0;

wnd.cbWndExtra = 0;

wnd.hbrBackground = (HBRUSH)(GetStockObject(GRAY_BRUSH));//背景色

wnd.hCursor = LoadCursor(NULL, IDC_ARROW);//光标

wnd.hIcon = LoadIcon(NULL, IDI_APPLICATION);//图标

//wnd.lpfnWndProc = DefWindowProc;//默认窗口过程函数,用于处理消息

wnd.lpfnWndProc = MyWindowProc;//自定义的窗口过程函数

wnd.lpszClassName = L"MrHuang";//窗口类名

wnd.lpszMenuName = NULL;//菜单资源名称

wnd.style = CS_HREDRAW | CS_DBLCLKS;//窗口类、样式

wnd.hInstance = hInstance;//实例句柄

RegisterClass(&wnd);

//创建窗口(返回之前发送WM_CREATE)

HWND hWnd = CreateWindow(L"MrHuang", L"第一个窗口程序",

WS_OVERLAPPEDWINDOW, 100, 100, 300, 300, NULL, NULL, hInstance, NULL);

//显示窗口

ShowWindow(hWnd, nShowCmd);

//更新窗口(发送WM_PAINT)

UpdateWindow(hWnd);

//消息循环(收到WM_QUIT消息退出)

MSG msg;

while (GetMessage(&msg, NULL, 0, 0))

{

TranslateMessage(&msg);//翻译消息

DispatchMessage(&msg);//分发消息到窗口过程

}

}

七、编辑框

1)创建编辑框

2)样式

3)获取编辑框的内容

4)代码实例

#include

#include

//自定义的窗口过程

LRESULT CALLBACK MyWindowProc(HWND hWnd, UINT Msg,

WPARAM wParam, LPARAM lParam)

{

switch (Msg)

{

case WM_DESTROY:

PostQuitMessage(0);//可以使GetMessage返回0

return 0;

case WM_CREATE:

{

LPCREATESTRUCT pcs = (LPCREATESTRUCT)lParam;

//创建编辑框控件

HWND hEdit=CreateWindow(L"ediT", L"这是一个编辑框", WS_CHILD | WS_VISIBLE | WS_VSCROLL |ES_MULTILINE|ES_AUTOVSCROLL|ES_NOHIDESEL,

30, 30, 200, 100, hWnd, (HMENU)111, pcs->hInstance, NULL);

//向编辑框发送选择字符串的消息

SendMessage(hEdit, EM_SETSEL, 2, 6);

//剪切刚刚选择的文字

//SendMessage(hEdit, WM_CUT, 0, 0);

//撤销

//SendMessage(hEdit, EM_UNDO, 0, 0);

return 0;

}

case WM_COMMAND:

{

WORD id = LOWORD(wParam);//控件ID

WORD code = HIWORD(wParam);//消息类型

HWND hCtrl = (HWND)lParam;//窗口句柄

//父窗口接收到子控件发的消息

if (id == 111 && code == EN_CHANGE)

{

//MessageBox(NULL, L"编辑框的文本被改变!", L"提示", MB_OK);

TCHAR buf[64] = {0};

GetWindowText(hCtrl, buf, sizeof(buf));

MessageBox(NULL, buf , L"提示", MB_OK);

}

}break;

default:

break;

}

return DefWindowProc(hWnd, Msg, wParam, lParam);

}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,

LPSTR lpCmdLine, int nShowCmd)

{

//1.注册窗口类

WNDCLASS wnd;

wnd.cbClsExtra = 0;

wnd.cbWndExtra = 0;

wnd.hbrBackground = (HBRUSH)(GetStockObject(GRAY_BRUSH));//背景色

wnd.hCursor = LoadCursor(NULL, IDC_ARROW);//光标

wnd.hIcon = LoadIcon(NULL, IDI_APPLICATION);//图标

//wnd.lpfnWndProc = DefWindowProc;//默认窗口过程函数,用于处理消息

wnd.lpfnWndProc = MyWindowProc;//自定义的窗口过程函数

wnd.lpszClassName = L"MrHuang";//窗口类名

wnd.lpszMenuName = NULL;//菜单资源名称

wnd.style = CS_HREDRAW | CS_DBLCLKS;//窗口类、样式

wnd.hInstance = hInstance;//实例句柄

RegisterClass(&wnd);

//创建窗口(返回之前发送WM_CREATE)

HWND hWnd = CreateWindow(L"MrHuang", L"第一个窗口程序",

WS_OVERLAPPEDWINDOW, 100, 100, 300, 300, NULL, NULL, hInstance, NULL);

//显示窗口

ShowWindow(hWnd, nShowCmd);

//更新窗口(发送WM_PAINT)

UpdateWindow(hWnd);

//消息循环(收到WM_QUIT消息退出)

MSG msg;

while (GetMessage(&msg, NULL, 0, 0))

{

TranslateMessage(&msg);//翻译消息

DispatchMessage(&msg);//分发消息到窗口过程

}

}

八、美化编辑框

代码实例

#include

#include

//自定义的窗口过程

LRESULT CALLBACK MyWindowProc(HWND hWnd, UINT Msg,

WPARAM wParam, LPARAM lParam)

{

switch (Msg)

{

case WM_DESTROY:

PostQuitMessage(0);//可以使GetMessage返回0

return 0;

case WM_CREATE:

{

LPCREATESTRUCT pcs = (LPCREATESTRUCT)lParam;

//创建编辑框控件

HWND hEdit = CreateWindow(L"ediT", L"这是一个编辑框", WS_CHILD | WS_VISIBLE | WS_VSCROLL | ES_MULTILINE | ES_AUTOVSCROLL | ES_NOHIDESEL,

30, 30, 200, 100, hWnd, (HMENU)111, pcs->hInstance, NULL);

//向编辑框发送选择字符串的消息

SendMessage(hEdit, EM_SETSEL, 2, 6);

//剪切刚刚选择的文字

//SendMessage(hEdit, WM_CUT, 0, 0);

//撤销

//SendMessage(hEdit, EM_UNDO, 0, 0);

return 0;

}

case WM_COMMAND:

{

WORD id = LOWORD(wParam);//控件ID

WORD code = HIWORD(wParam);//消息类型

HWND hCtrl = (HWND)lParam;//窗口句柄

//父窗口接收到子控件发的消息

if (id == 111 && code == EN_CHANGE)

{

//MessageBox(NULL, L"编辑框的文本被改变!", L"提示", MB_OK);

TCHAR buf[64] = { 0 };

GetWindowText(hCtrl, buf, sizeof(buf));

MessageBox(NULL, buf, L"提示", MB_OK);

}

}break;

case WM_CTLCOLOREDIT:

{

HDC hdc = (HDC)wParam;

HWND hCtrl = (HWND)lParam;

//获取编辑框控件的ID

UINT CtrlID = GetWindowLong(hCtrl, GWL_ID);

if (CtrlID == 111)

{

SetTextColor(hdc, RGB(255, 0, 0));//文字颜色

SetBkMode(hdc, TRANSPARENT);//文字背景色透明

}

HBRUSH hbr = CreateSolidBrush(RGB(255, 255, 0));

return (LRESULT)hbr;//控件的背景色

}break;

default:

break;

}

return DefWindowProc(hWnd, Msg, wParam, lParam);

}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,

LPSTR lpCmdLine, int nShowCmd)

{

//1.注册窗口类

WNDCLASS wnd;

wnd.cbClsExtra = 0;

wnd.cbWndExtra = 0;

wnd.hbrBackground = (HBRUSH)(GetStockObject(GRAY_BRUSH));//背景色

wnd.hCursor = LoadCursor(NULL, IDC_ARROW);//光标

wnd.hIcon = LoadIcon(NULL, IDI_APPLICATION);//图标

//wnd.lpfnWndProc = DefWindowProc;//默认窗口过程函数,用于处理消息

wnd.lpfnWndProc = MyWindowProc;//自定义的窗口过程函数

wnd.lpszClassName = L"MrHuang";//窗口类名

wnd.lpszMenuName = NULL;//菜单资源名称

wnd.style = CS_HREDRAW | CS_DBLCLKS;//窗口类、样式

wnd.hInstance = hInstance;//实例句柄

RegisterClass(&wnd);

//创建窗口(返回之前发送WM_CREATE)

HWND hWnd = CreateWindow(L"MrHuang", L"第一个窗口程序",

WS_OVERLAPPEDWINDOW, 100, 100, 300, 300, NULL, NULL, hInstance, NULL);

//显示窗口

ShowWindow(hWnd, nShowCmd);

//更新窗口(发送WM_PAINT)

UpdateWindow(hWnd);

//消息循环(收到WM_QUIT消息退出)

MSG msg;

while (GetMessage(&msg, NULL, 0, 0))

{

TranslateMessage(&msg);//翻译消息

DispatchMessage(&msg);//分发消息到窗口过程

}

}

九、列表框

1)创建列表框

2)样式

3)利用SendMessage()函数获取选择的内容。

4)列表控件消息

5)代码实例

#include

#include

//自定义的窗口过程

LRESULT CALLBACK MyWindowProc(HWND hWnd, UINT Msg,

WPARAM wParam, LPARAM lParam)

{

switch (Msg)

{

case WM_DESTROY:

PostQuitMessage(0);//可以使GetMessage返回0

return 0;

case WM_CREATE:

{

LPCREATESTRUCT pcs = (LPCREATESTRUCT)lParam;

//创建列表框控件

HWND hListBox=CreateWindow(L"listBOX", L"XXX", WS_CHILD | WS_VISIBLE|LBS_SORT|LBS_NOTIFY,

30, 30, 200, 100, hWnd, (HMENU)111, GetModuleHandle(NULL), NULL);

//向末尾添加选项

SendMessage(hListBox, LB_ADDSTRING, 0,(LPARAM) L"B音乐");

SendMessage(hListBox, LB_ADDSTRING, 0, (LPARAM)L"A啤酒");

SendMessage(hListBox, LB_ADDSTRING, 0, (LPARAM)L"C啤酒");

//插入字符串

SendMessage(hListBox, LB_INSERTSTRING, 1, (LPARAM)L"炸鸡");

//选择其中一项,选择索引为2的,单选模式才有效

SendMessage(hListBox, LB_SETCURSEL, 2, 0 );

return 0;

}

case WM_COMMAND:

{

WORD id = LOWORD(wParam);//控件ID

WORD code = HIWORD(wParam);//消息类型

HWND hCtrl = (HWND)lParam;//窗口句柄

//父窗口接收到子控件发的消息

if (id == 111 && code == LBN_SELCHANGE)//创建时需指定LBS_NOTIFY样式

{

// 获取当前选择的索引

int index=SendMessage(hCtrl, LB_GETCURSEL, 0,0);

//获取索引对应的字符串

TCHAR buf[64] = { 0 };

SendMessage(hCtrl, LB_GETTEXT, index, (LPARAM)buf);

MessageBox(NULL, buf, L"提示", MB_OK);

}

}break;

default:

break;

}

return DefWindowProc(hWnd, Msg, wParam, lParam);

}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,

LPSTR lpCmdLine, int nShowCmd)

{

//1.注册窗口类

WNDCLASS wnd;

wnd.cbClsExtra = 0;

wnd.cbWndExtra = 0;

wnd.hbrBackground = (HBRUSH)(GetStockObject(GRAY_BRUSH));//背景色

wnd.hCursor = LoadCursor(NULL, IDC_ARROW);//光标

wnd.hIcon = LoadIcon(NULL, IDI_APPLICATION);//图标

//wnd.lpfnWndProc = DefWindowProc;//默认窗口过程函数,用于处理消息

wnd.lpfnWndProc = MyWindowProc;//自定义的窗口过程函数

wnd.lpszClassName = L"MrHuang";//窗口类名

wnd.lpszMenuName = NULL;//菜单资源名称

wnd.style = CS_HREDRAW | CS_DBLCLKS;//窗口类、样式

wnd.hInstance = hInstance;//实例句柄

RegisterClass(&wnd);

//创建窗口(返回之前发送WM_CREATE)

HWND hWnd = CreateWindow(L"MrHuang", L"第一个窗口程序",

WS_OVERLAPPEDWINDOW, 100, 100, 300, 300, NULL, NULL, hInstance, NULL);

//显示窗口

ShowWindow(hWnd, nShowCmd);

//更新窗口(发送WM_PAINT)

UpdateWindow(hWnd);

//消息循环(收到WM_QUIT消息退出)

MSG msg;

while (GetMessage(&msg, NULL, 0, 0))

{

TranslateMessage(&msg);//翻译消息

DispatchMessage(&msg);//分发消息到窗口过程

}

}

十、美化列表框

代码实例

#include

#include

//自定义的窗口过程

LRESULT CALLBACK MyWindowProc(HWND hWnd, UINT Msg,

WPARAM wParam, LPARAM lParam)

{

switch (Msg)

{

case WM_DESTROY:

PostQuitMessage(0);//可以使GetMessage返回0

return 0;

case WM_CREATE:

{

LPCREATESTRUCT pcs = (LPCREATESTRUCT)lParam;

//创建列表框控件

HWND hListBox = CreateWindow(L"listBOX", L"XXX", WS_CHILD | WS_VISIBLE | LBS_SORT | LBS_NOTIFY,

30, 30, 200, 100, hWnd, (HMENU)111, GetModuleHandle(NULL), NULL);

//向末尾添加选项

SendMessage(hListBox, LB_ADDSTRING, 0, (LPARAM)L"B音乐");

SendMessage(hListBox, LB_ADDSTRING, 0, (LPARAM)L"A啤酒");

SendMessage(hListBox, LB_ADDSTRING, 0, (LPARAM)L"C啤酒");

//插入字符串

SendMessage(hListBox, LB_INSERTSTRING, 1, (LPARAM)L"炸鸡");

//选择其中一项,选择索引为2的,单选模式才有效

SendMessage(hListBox, LB_SETCURSEL, 2, 0);

return 0;

}

case WM_CTLCOLORLISTBOX:

{

HDC hdc = (HDC)wParam;

HWND hCtrl = (HWND)lParam;

UINT CtrlID = GetWindowLong(hCtrl, GWL_ID);

if (CtrlID == 111)//是不是想要美化的某一个列表框控件

{

SetTextColor(hdc, RGB(255, 0, 0));

SetBkMode(hdc , TRANSPARENT);

HBRUSH bsh = CreateSolidBrush(RGB(0, 255, 255));

return (LRESULT)bsh;

}

}break;

case WM_COMMAND:

{

WORD id = LOWORD(wParam);//控件ID

WORD code = HIWORD(wParam);//消息类型

HWND hCtrl = (HWND)lParam;//窗口句柄

//父窗口接收到子控件发的消息

if (id == 111 && code == LBN_SELCHANGE)//创建时需指定LBS_NOTIFY样式

{

// 获取当前选择的索引

int index = SendMessage(hCtrl, LB_GETCURSEL, 0, 0);

//获取索引对应的字符串

TCHAR buf[64] = { 0 };

SendMessage(hCtrl, LB_GETTEXT, index, (LPARAM)buf);

MessageBox(NULL, buf, L"提示", MB_OK);

}

}break;

default:

break;

}

return DefWindowProc(hWnd, Msg, wParam, lParam);

}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,

LPSTR lpCmdLine, int nShowCmd)

{

//1.注册窗口类

WNDCLASS wnd;

wnd.cbClsExtra = 0;

wnd.cbWndExtra = 0;

wnd.hbrBackground = (HBRUSH)(GetStockObject(GRAY_BRUSH));//背景色

wnd.hCursor = LoadCursor(NULL, IDC_ARROW);//光标

wnd.hIcon = LoadIcon(NULL, IDI_APPLICATION);//图标

//wnd.lpfnWndProc = DefWindowProc;//默认窗口过程函数,用于处理消息

wnd.lpfnWndProc = MyWindowProc;//自定义的窗口过程函数

wnd.lpszClassName = L"MrHuang";//窗口类名

wnd.lpszMenuName = NULL;//菜单资源名称

wnd.style = CS_HREDRAW | CS_DBLCLKS;//窗口类、样式

wnd.hInstance = hInstance;//实例句柄

RegisterClass(&wnd);

//创建窗口(返回之前发送WM_CREATE)

HWND hWnd = CreateWindow(L"MrHuang", L"第一个窗口程序",

WS_OVERLAPPEDWINDOW, 100, 100, 300, 300, NULL, NULL, hInstance, NULL);

//显示窗口

ShowWindow(hWnd, nShowCmd);

//更新窗口(发送WM_PAINT)

UpdateWindow(hWnd);

//消息循环(收到WM_QUIT消息退出)

MSG msg;

while (GetMessage(&msg, NULL, 0, 0))

{

TranslateMessage(&msg);//翻译消息

DispatchMessage(&msg);//分发消息到窗口过程

}

}

十一、组合框

1)什么是组合框

2)样式

3)代码实例

#include

#include

//自定义的窗口过程

LRESULT CALLBACK MyWindowProc(HWND hWnd, UINT Msg,

WPARAM wParam, LPARAM lParam)

{

switch (Msg)

{

case WM_DESTROY:

PostQuitMessage(0);//可以使GetMessage返回0

return 0;

case WM_CREATE:

{

LPCREATESTRUCT pcs = (LPCREATESTRUCT)lParam;

//创建组合框

HWND hComboBox=CreateWindow(L"comboBOX", L"XXX", WS_CHILD | WS_VISIBLE | CBS_DROPDOWNLIST|CBS_SORT,

30, 30, 200, 100, hWnd, (HMENU)111, pcs->hInstance, NULL);

//向组合框添加选项

SendMessage(hComboBox, CB_ADDSTRING, 0, (LPARAM)L"C音乐");

SendMessage(hComboBox, CB_ADDSTRING, 0, (LPARAM)L"A啤酒");

SendMessage(hComboBox, CB_ADDSTRING, 0, (LPARAM)L"B炸鸡");

//插入选项

SendMessage(hComboBox, CB_INSERTSTRING, 2, (LPARAM)L"编程");

//选择某一项

SendMessage(hComboBox, CB_SETCURSEL, 3, 0 );

return 0;

}

case WM_COMMAND:

{

WORD id = LOWORD(wParam);//控件ID

WORD code = HIWORD(wParam);//消息类型

HWND hCtrl = (HWND)lParam;//窗口句柄

//父窗口接收到子控件发的消息

if (id == 111 && code ==CBN_SELCHANGE)

{

//获取当前选择的索引

int index=SendMessage(hCtrl, CB_GETCURSEL, 0, 0);

//获取索引对应的文本

TCHAR buf[64] = {0};

SendMessage(hCtrl, CB_GETLBTEXT, index, (LPARAM)buf);

MessageBox(hWnd, buf, L"提示", MB_OK);

}

}break;

default:

break;

}

return DefWindowProc(hWnd, Msg, wParam, lParam);

}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,

LPSTR lpCmdLine, int nShowCmd)

{

//1.注册窗口类

WNDCLASS wnd;

wnd.cbClsExtra = 0;

wnd.cbWndExtra = 0;

wnd.hbrBackground = (HBRUSH)(GetStockObject(GRAY_BRUSH));//背景色

wnd.hCursor = LoadCursor(NULL, IDC_ARROW);//光标

wnd.hIcon = LoadIcon(NULL, IDI_APPLICATION);//图标

//wnd.lpfnWndProc = DefWindowProc;//默认窗口过程函数,用于处理消息

wnd.lpfnWndProc = MyWindowProc;//自定义的窗口过程函数

wnd.lpszClassName = L"MrHuang";//窗口类名

wnd.lpszMenuName = NULL;//菜单资源名称

wnd.style = CS_HREDRAW | CS_DBLCLKS;//窗口类、样式

wnd.hInstance = hInstance;//实例句柄

RegisterClass(&wnd);

//创建窗口(返回之前发送WM_CREATE)

HWND hWnd = CreateWindow(L"MrHuang", L"第一个窗口程序",

WS_OVERLAPPEDWINDOW, 100, 100, 300, 300, NULL, NULL, hInstance, NULL);

//显示窗口

ShowWindow(hWnd, nShowCmd);

//更新窗口(发送WM_PAINT)

UpdateWindow(hWnd);

//消息循环(收到WM_QUIT消息退出)

MSG msg;

while (GetMessage(&msg, NULL, 0, 0))

{

TranslateMessage(&msg);//翻译消息

DispatchMessage(&msg);//分发消息到窗口过程

}

}

十二、滚动条

1)什么是滚动条

2)WM_HSCROLL接收并处理水平滚动条发送的消息

3)代码实例

#include

#include

//自定义的窗口过程

LRESULT CALLBACK MyWindowProc(HWND hWnd, UINT Msg,

WPARAM wParam, LPARAM lParam)

{

switch (Msg)

{

case WM_DESTROY:

PostQuitMessage(0);//可以使GetMessage返回0

return 0;

case WM_CREATE:

{

LPCREATESTRUCT pcs = (LPCREATESTRUCT)lParam;

//创建滚动条控件

HWND hScrollBar=CreateWindow(L"scrollBAR", L"XXX", WS_CHILD | WS_VISIBLE | SBS_HORZ,

30, 30, 200, 30, hWnd, (HMENU)111, pcs->hInstance, NULL);

//设置滚动条的范围

SendMessage(hScrollBar, SBM_SETRANGE, 0, 100);

//设置滚动条的滑块位置

SendMessage(hScrollBar, SBM_SETPOS, 40, 1);

return 0;

}

//水平滚动条发送的消息

case WM_HSCROLL:

{

WORD code = LOWORD(wParam);//操作码

HWND hCtrl = (HWND)lParam;//控件句柄

//获取滚动条的滑块位置

int pos= SendMessage(hCtrl, SBM_GETPOS, 0, 0);

switch (code)

{

//点击左边箭头

case SB_LINELEFT:

OutputDebugString(L"SB_LINELEFT\n");

pos -= 1;

break;

//点击右边箭头

case SB_LINERIGHT:

OutputDebugString(L"SB_LINERIGHT\n");

pos += 1;

break;

//点击左空白区

case SB_PAGELEFT:

OutputDebugString(L"SB_PAGELEFT\n");

pos -= 10;

break;

//点击右空白区

case SB_PAGERIGHT:

OutputDebugString(L"SB_PAGERIGHT\n");

pos += 10;

break;

//拖动滑块时的消息

case SB_THUMBPOSITION:

pos = HIWORD(wParam);//拖拽位置,仅当SB_THUMBPOSITION有用

char str[64];

sprintf(str, "SB_THUMBPOSITION %d\n", pos);

OutputDebugStringA(str);

break;

}

//设置滚动条的滑块位置

SendMessage(hCtrl, SBM_SETPOS, pos, 1);

}break;

default:

break;

}

return DefWindowProc(hWnd, Msg, wParam, lParam);

}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,

LPSTR lpCmdLine, int nShowCmd)

{

//1.注册窗口类

WNDCLASS wnd;

wnd.cbClsExtra = 0;

wnd.cbWndExtra = 0;

wnd.hbrBackground = (HBRUSH)(GetStockObject(GRAY_BRUSH));//背景色

wnd.hCursor = LoadCursor(NULL, IDC_ARROW);//光标

wnd.hIcon = LoadIcon(NULL, IDI_APPLICATION);//图标

//wnd.lpfnWndProc = DefWindowProc;//默认窗口过程函数,用于处理消息

wnd.lpfnWndProc = MyWindowProc;//自定义的窗口过程函数

wnd.lpszClassName = L"MrHuang";//窗口类名

wnd.lpszMenuName = NULL;//菜单资源名称

wnd.style = CS_HREDRAW | CS_DBLCLKS;//窗口类、样式

wnd.hInstance = hInstance;//实例句柄

RegisterClass(&wnd);

//创建窗口(返回之前发送WM_CREATE)

HWND hWnd = CreateWindow(L"MrHuang", L"第一个窗口程序",

WS_OVERLAPPEDWINDOW, 100, 100, 300, 300, NULL, NULL, hInstance, NULL);

//显示窗口

ShowWindow(hWnd, nShowCmd);

//更新窗口(发送WM_PAINT)

UpdateWindow(hWnd);

//消息循环(收到WM_QUIT消息退出)

MSG msg;

while (GetMessage(&msg, NULL, 0, 0))

{

TranslateMessage(&msg);//翻译消息

DispatchMessage(&msg);//分发消息到窗口过程

}

}

十三、美化滚动条

代码实例

#include

#include

//自定义的窗口过程

LRESULT CALLBACK MyWindowProc(HWND hWnd, UINT Msg,

WPARAM wParam, LPARAM lParam)

{

switch (Msg)

{

case WM_DESTROY:

PostQuitMessage(0);//可以使GetMessage返回0

return 0;

case WM_CREATE:

{

LPCREATESTRUCT pcs = (LPCREATESTRUCT)lParam;

//创建滚动条控件

HWND hScrollBar = CreateWindow(L"scrollBAR", L"XXX", WS_CHILD | WS_VISIBLE | SBS_HORZ,

30, 30, 200, 30, hWnd, (HMENU)111, pcs->hInstance, NULL);

//设置滚动条的范围

SendMessage(hScrollBar, SBM_SETRANGE, 0, 100);

//设置滚动条的滑块位置

SendMessage(hScrollBar, SBM_SETPOS, 40, 1);

return 0;

}

case WM_CTLCOLORSCROLLBAR:

{

HDC hdc = (HDC)wParam;

HWND hCtrl = (HWND)lParam;

LONG CtrlID=GetWindowLong(hCtrl, GWL_ID);

if (CtrlID == 111)

{

HBRUSH bsh = CreateSolidBrush(RGB(255, 0, 0));

return (LRESULT)bsh;

}

}break;

//水平滚动条发送的消息

case WM_HSCROLL:

{

WORD code = LOWORD(wParam);//操作码

HWND hCtrl = (HWND)lParam;//控件句柄

//获取滚动条的滑块位置

int pos = SendMessage(hCtrl, SBM_GETPOS, 0, 0);

switch (code)

{

//点击左边箭头

case SB_LINELEFT:

OutputDebugString(L"SB_LINELEFT\n");

pos -= 1;

break;

//点击右边箭头

case SB_LINERIGHT:

OutputDebugString(L"SB_LINERIGHT\n");

pos += 1;

break;

//点击左空白区

case SB_PAGELEFT:

OutputDebugString(L"SB_PAGELEFT\n");

pos -= 10;

break;

//点击右空白区

case SB_PAGERIGHT:

OutputDebugString(L"SB_PAGERIGHT\n");

pos += 10;

break;

//拖动滑块时的消息

case SB_THUMBPOSITION:

pos = HIWORD(wParam);//拖拽位置,仅当SB_THUMBPOSITION有用

char str[64];

sprintf(str, "SB_THUMBPOSITION %d\n", pos);

OutputDebugStringA(str);

break;

}

//设置滚动条的滑块位置

SendMessage(hCtrl, SBM_SETPOS, pos, 1);

}break;

default:

break;

}

return DefWindowProc(hWnd, Msg, wParam, lParam);

}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,

LPSTR lpCmdLine, int nShowCmd)

{

//1.注册窗口类

WNDCLASS wnd;

wnd.cbClsExtra = 0;

wnd.cbWndExtra = 0;

wnd.hbrBackground = (HBRUSH)(GetStockObject(GRAY_BRUSH));//背景色

wnd.hCursor = LoadCursor(NULL, IDC_ARROW);//光标

wnd.hIcon = LoadIcon(NULL, IDI_APPLICATION);//图标

//wnd.lpfnWndProc = DefWindowProc;//默认窗口过程函数,用于处理消息

wnd.lpfnWndProc = MyWindowProc;//自定义的窗口过程函数

wnd.lpszClassName = L"MrHuang";//窗口类名

wnd.lpszMenuName = NULL;//菜单资源名称

wnd.style = CS_HREDRAW | CS_DBLCLKS;//窗口类、样式

wnd.hInstance = hInstance;//实例句柄

RegisterClass(&wnd);

//创建窗口(返回之前发送WM_CREATE)

HWND hWnd = CreateWindow(L"MrHuang", L"第一个窗口程序",

WS_OVERLAPPEDWINDOW, 100, 100, 300, 300, NULL, NULL, hInstance, NULL);

//显示窗口

ShowWindow(hWnd, nShowCmd);

//更新窗口(发送WM_PAINT)

UpdateWindow(hWnd);

//消息循环(收到WM_QUIT消息退出)

MSG msg;

while (GetMessage(&msg, NULL, 0, 0))

{

TranslateMessage(&msg);//翻译消息

DispatchMessage(&msg);//分发消息到窗口过程

}

}