#include <windows.h>
//定义按钮标识符是指定一个唯一的整数值标识按钮对象,数字要不一样,名称自己定义,一般的做法是在程序的头部用define语句声明一个宏常量
#define IDC_MAIN_BUTTON 101 // 按钮标识符
#define IDC_MAIN_EDIT 102 // 编辑框标识符
HWND hEdit;
LRESULT CALLBACK WinProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam);
int WINAPI WinMain(HINSTANCE hInst,HINSTANCE hPrevInst,LPSTR lpCmdLine,int nShowCmd)
{ //注册窗体类
WNDCLASSEX wClass;
ZeroMemory(&wClass,sizeof(WNDCLASSEX));
wClass.cbClsExtra=NULL;
wClass.cbSize=sizeof(WNDCLASSEX);
wClass.cbWndExtra=NULL;
wClass.hbrBackground=(HBRUSH)COLOR_WINDOW;
wClass.hCursor=LoadCursor(NULL,IDC_ARROW);
wClass.hIcon=NULL;
wClass.hIconSm=NULL;
wClass.hInstance=hInst;
wClass.lpfnWndProc=(WNDPROC)WinProc;
wClass.lpszClassName="Window Class";
wClass.lpszMenuName=NULL;
wClass.style=CS_HREDRAW|CS_VREDRAW;
if(!RegisterClassEx(&wClass))
{
int nResult=GetLastError();
MessageBox(NULL,
"注册窗体类失败\r\n",
"窗体类失败",
MB_ICONERROR);
}
//创建窗体
HWND hWnd=CreateWindowEx(NULL,
"Window Class",
"为窗体添加控件......",
WS_OVERLAPPEDWINDOW,
200,
200,
640,
480,
NULL,
NULL,
hInst,
NULL);
if(!hWnd)
{
int nResult=GetLastError();
MessageBox(NULL,
"创建窗体失败过程发生错误\r\n",
"创建窗体失败",
MB_ICONERROR);
}
//显示窗体
ShowWindow(hWnd,nShowCmd);
//处理消息
MSG msg;
ZeroMemory(&msg,sizeof(MSG));
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
//回调函数
LRESULT CALLBACK WinProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
switch(msg)
{
case WM_CREATE:
//当一个程序创建窗体时,WM_CREATE消息会被触发,当希望做一些程序初始化工作时,可以把代码放到WM_CREATE消息处理逻辑中。
//简单地说,本来是创建一个空白的窗体,可我不想这样,我想创建一个有内容的窗体,那你可以把你想在窗体刚刚打开时候想展示的东西的代码写进这个消息处理逻辑中
//额外附加:WM_CREATE是windows中一个窗口消息。当一个应用程序通过CreateWindowEx函数或者CreateWindow函数请求创建窗口时发送此消息,(此消息在函数返回之前发送)。
//产生时间是窗口创建之后显示之前,同时WM_CREATE也必须是不进队列消息。
//例如,当要获取系统的字体时,我们可以先向这个窗口发送 WM_CREATE消息,以后字体不会改变了,程序会保存这个系统字体的消息!以后就可以用这个字体了!
{
// 创建一个编辑框
hEdit=CreateWindowEx(WS_EX_CLIENTEDGE,//编辑框四周立体边框
"EDIT", //编辑框类型,BUTTON和EDIT都是Win32API内置的预定义的类型
"", //也可以在此处设置初始文本,就是框里面显示的文字
WS_CHILD|WS_VISIBLE|
ES_MULTILINE|ES_AUTOVSCROLL|ES_AUTOHSCROLL, //参考https://msdn.microsoft.com/zh-cn/library/czada357.aspx
30, //横坐标
30, //纵坐标
200, //宽
100, //高
hWnd,
(HMENU)IDC_MAIN_EDIT, //IDC_MAIN_EDIT编辑框的标识符,前面已定义了;(HMENU)是菜单句柄,在WinDef.h中定义。
GetModuleHandle(NULL), //GetModuleHandle函数的作用是返回指定模块名的句柄,如果为NULL,则返回本模块的句柄。
NULL);
HGDIOBJ hfDefault=GetStockObject(DEFAULT_GUI_FONT);//设置字体
SendMessage(hEdit,
WM_SETFONT, //当绘制文本时程序发送此消息得到控件要用的颜色
(WPARAM)hfDefault,
MAKELPARAM(FALSE,0));
//如果想一开始在编辑框显示点什么,可以用SendMessage()函数产生一条窗体消息,当然你也可以在前面第三个参数设置初始文本
//函数原型:LRESULT SendMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM IParam)
//更多参考https://blog.csdn.net/lunkay/article/details/50519685
SendMessage(hEdit,
WM_SETTEXT, //设置窗体文本消息,对于编辑框(Edit)来说,此消息字符串用于设置文本框内容
NULL,
(LPARAM)"用户在这里输入文本并编辑...");
// 创建一个按钮,也可以像文本框一样在开头声明HWND hWndButton
HWND hWndButton=CreateWindowEx(NULL, //第一个参数表示窗体(按钮)的扩展风格,设置为NULL
"BUTTON", //窗体类型,按钮
"确定", //指向窗体(按钮)标题的指针
WS_TABSTOP|WS_VISIBLE| //参考https://msdn.microsoft.com/zh-cn/library/czada357.aspx
WS_CHILD|BS_DEFPUSHBUTTON,
50,
150,//大于130,因为前面有个文本框,30+100,所以这个按钮的纵坐标要大于130,要不会重叠
100,
24,
hWnd, //设置父窗口的句柄
(HMENU)IDC_MAIN_BUTTON,//按钮的标识符
GetModuleHandle(NULL), //对于按钮不是必须的,可设为NULL
NULL); //对于按钮不是必须的,可设为NULL
SendMessage(hWndButton,
WM_SETFONT,
(WPARAM)hfDefault,
MAKELPARAM(FALSE,0)); //makelparam和makewparam都是一样的 将两个word型合并成一个dword型。一个在高16位,一个在低16位
}
break;
case WM_COMMAND: //WM_COMMAND,程序代码,在窗口菜单程序中使用。 //窗口菜单 或子窗口控件产生的消息
switch(LOWORD(wParam)) //LOWORD(wParam):菜单id
{
case IDC_MAIN_BUTTON: //点击了这个按钮会干嘛
{
char buffer[256];
SendMessage(hEdit,
WM_GETTEXT, //应用程序发送此消息来复制对应窗口的文本到缓冲区
sizeof(buffer)/sizeof(buffer[0]),
reinterpret_cast<LPARAM>(buffer));
// reinterpret_cast C++里的强制类型转换符。
//reinterpret_cast<type-id> (expression)
//type-id 必须是一个指针、引用、算术类型、函数指针或者成员指针。它可以把一个指针转换成一个整数,也可以把一个整数转换成一个指针(先把一个指针转换成一个整数,再把该整数转换成原类型的指针,还可以得到原先的指针值)。
MessageBox(NULL, //窗口句柄
buffer, //消息框内显示的文本消息
"信息提示", //消息框的标题
MB_ICONINFORMATION); //消息提示图标
}
break;
}
break;
case WM_DESTROY:
{
PostQuitMessage(0);
return 0;
}
break;
}
return DefWindowProc(hWnd,msg,wParam,lParam);
}
效果:
在里面输入漫步云端
然后点击确定