控件
我们可以把控件当成特殊的一类窗口,所以,创建控件与创建窗口一样,使用CreateWindow或CreateWindowEx函数创建控件
第二种方式是直接在资源视图中拖拽控件就可以了,这些都是windows利用资源脚本帮我们已经写好了这些代码,所以我们现在添加控件很方便,只需要处理好各种控件消息程序就好了
发送消息
- SendMessage -- 不进消息队列,直接进入窗口过程函数,直到消息处理完才返回
- PostMessage -- 将消息投递到消息队列,直接返回,不会等待消息处理
控件消息
- BN_XXX -- 控件向父窗口发送的消息
- BM__XXX -- 用于控制控件的消息
- BN_CLICKED -- 当按钮被按下的时候发送此消息
- BM_CLICK -- 模拟点击按钮
- 当控件自身状态改变的时候,会向父窗口发送WM_COMMAND消息,通过向控件发送消息来控制控件的状态属性
// TestControls.cpp : 定义应用程序的入口点。
//
#include "stdafx.h"
#include "Win32Test.h"
#include "resource.h"
// “关于”框的消息处理程序。
INT_PTR CALLBACK TestDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_INITDIALOG:
return (INT_PTR)TRUE;
case WM_COMMAND:
{
WORD wNotiCode = HIWORD(wParam);
WORD wId = LOWORD(wParam);
HWND hControl = (HWND)lParam;
switch (wNotiCode)
{
case BN_CLICKED:
{
switch (wId)
{
case IDC_BUTTON1:
MessageBox(hDlg, TEXT("测试按钮被按下"), NULL, MB_OK);
break;
case IDC_BUTTON2:
{
//获取按钮ID
HWND hBtnTest = GetDlgItem(hDlg, IDC_BUTTON1);
//发送BM消息模拟按钮1点击消息
SendMessage(hBtnTest, BM_CLICK, NULL, NULL);
}
break;
//获取文本框的内容
case IDC_BUTTON3:
{
//获取文本框的窗口句柄
HWND hEdtTest = GetDlgItem(hDlg, IDC_EDIT1);
//发送EM_GETLINE,获取内容
TCHAR szBuff[MAXBYTE] = { MAXBYTE, 0 };
SendMessage(hEdtTest, EM_GETLINE, 0, (LPARAM)szBuff);
//发送WM_TEXT获取文本
//SendMessage(hEdtTest, WM_GETTEXT, MAXBYTE, (LPARAM)szBuff);
//获取对话框标题
//SendMessage(hDlg, WM_GETTEXT, MAXBYTE, (LPARAM)szBuff);
//获取文本
//GetWindowText(hEdtTest, szBuff, MAXBYTE);
//获取文本框内容
//GetDlgItemText(hDlg, EDT_TEST, szBuff, MAXBYTE);
//GetDlgItemInt;
//
//SendDlgItemMessage
MessageBox(hDlg, szBuff, NULL, MB_OK);
}
break;
case IDC_BUTTON4:
SetDlgItemText(hDlg, IDC_EDIT1, TEXT("hello"));
break;
default:
break;
}
}
break;
default:
break;
}
}
break;
case WM_CLOSE:
EndDialog(hDlg, 0);
break;
}
return (INT_PTR)FALSE;
}
int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
_In_opt_ HINSTANCE hPrevInstance,
_In_ LPWSTR lpCmdLine,
_In_ int nCmdShow)
{
DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, TestDlgProc);
return 0;
}