如果要实现点击一个按钮,然后将输入框中的输入的内容在弹出的提示框中显示出来这个功能的话,使用大部分可视化IDE开发工具都是很简单的事情,用鼠标拖拖控件不用几分钟就可以实现.
当然了,如果真按照以上方式实现这个功能然后写成一篇文章的话也就有点太敷衍了.所以,为了加大难度,在这里我们要使用C语言来实现这个功能.界面功能全部用代码实现,想想就有点高大上是不是.
首先,我们要先创建窗口.需要创建一个主窗口和3个控件(子窗口).主窗口需要先注册,而控件则不需要,系统已经为我们预先注册了常用的控件,我们直接创建对应的控件即可.这里我们使用了BUTTON按钮控件、static静态文本控件、EDIT编辑控件.都是使用CreateWindow函数来创建的,函数定义如下:
HWND WINAPI CreateWindow( _In_opt_ LPCTSTR lpClassName, _In_opt_ LPCTSTR lpWindowName, _In_ DWORD dwStyle, _In_intx, _In_inty, _In_intnWidth, _In_intnHeight, _In_opt_ HWND hWndParent, _In_opt_ HMENU hMenu, _In_opt_ HINSTANCE hInstance, _In_opt_ LPVOID lpParam);
第一个参数用于指定不同类型的窗口,第九个参数指定控件唯一ID,相关参数都可以在msdn找到的,这里不展开来写了,以后我的资料库会对这些内容进行详细描写.
//创建窗口
BOOL InitInstance(HINSTANCE hinstance,int nCmdShow){
HWND hwnd;
RECT rect;
//保存应用程序实例句柄
hinst = hinstance;
hwnd = CreateWindow(
"MainWClass",//窗口类名,使用之前注册的主窗口类
"御坂网络欢迎你",//窗口名,显示在串口标题栏上的字符串
WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | WS_POPUPWINDOW,//窗口样式
CW_USEDEFAULT,//水平位置(默认)
CW_USEDEFAULT,//垂直位置(默认)
800,//高
600,//宽
(HWND)NULL,//无父窗口
(HMENU)NULL,//菜单
hinstance,//应用程序实例
(LPVOID)NULL//无窗口创建数据
);
//窗口是否创建成功
if(!hwnd){
return FALSE;
}
hwndbutton = CreateWindow(
"BUTTON",//窗口类名,使用之前注册的主窗口类
"按钮",//窗口名,显示在串口标题栏上的字符串
WS_CHILD | WS_VISIBLE |BS_PUSHBUTTON,//窗口样式
420,//水平位置(默认)
90,//垂直位置(默认)
120,//宽
40,//高
(HWND)hwnd,//无父窗口
(HMENU)1,//菜单
(HINSTANCE)NULL,//应用程序实例
(LPVOID)NULL//无窗口创建数据
);
hwndstatic = CreateWindow(
TEXT("static"),
TEXT("你好"),
WS_CHILD | WS_VISIBLE | WS_BORDER,
420,0,150,80,
(HWND)hwnd,
(HMENU)2,
(HINSTANCE)NULL,
(LPVOID)NULL
);
hwndedit = CreateWindow(
"EDIT",
"666",
WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_BORDER | ES_LEFT |ES_MULTILINE | ES_AUTOVSCROLL,
0,0,400,200,
(HWND)hwnd,
(HMENU)3,
(HINSTANCE)NULL,
(LPVOID)NULL
);
//窗口是否创建成功
if(!hwndbutton){
return FALSE;
}
ShowWindow(hwnd,nCmdShow);
UpdateWindow(hwnd);
return TRUE;
}
窗口创建完成之后就是显示窗口,更新窗口.之后消息循环
我们要在消息循环对一些事件进行处理.也就是实现我们标题所述功能,这个刚开始我也完全没有头绪,不过最后还是实现了通过WM_COMMAND消息获取点击按钮事件进行处理,GetWindowText函数获取编辑框内容,最终实现点击按钮弹出提示框.
//消息处理函数
LRESULT CALLBACK MainWndProc(
HWND hwnd,//窗口句柄
UINT uMsg,//消息标识符
WPARAM wParam,//消息的第一个参数
LPARAM lParam//消息的第二个参数
){
int wmId, wmEvent;
switch(uMsg){
case WM_CREATE://窗口创建时收到此消息
break;
case WM_PAINT://窗口被绘制时收到此消息
break;
case WM_SIZE://窗口大小改变时收到此消息
//OnWindowResize();
break;
case WM_NOTIFY:// NOTIFY 通常由控件发送给其父窗口,说明控件正在进行某项串口操作
break;
case WM_DESTROY://窗口销毁,单击右上角的关闭按钮会触发此消息
PostQuitMessage(0);
break;
case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
switch (wmId){
case 1: //按下按钮
//更改文本框的内容
SetWindowText( hwndstatic, TEXT("你点击了下面的按钮") );
LPTSTR lpString[128];
GetWindowText(hwndedit,lpString,128);
MessageBox(NULL,lpString,"输入的内容是",MB_OK);
break;
default:
//MessageBox(NULL,"dd","ee",MB_OK);
//不处理的消息一定要交给 DefWindowProc 处理。
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
break;
default://可以在此处理其他消息
break;
}
//有很多消息未做处理,需要由默认串口消息处理函数来处理
return DefWindowProc(hwnd,uMsg,wParam,lParam);
}
通过上面的消息处理函数,我们的程序就可以响应我们的点击按钮事件了.最终效果如图
当然还要加下面这些声明和代码WinMain函数才可以运行
#define _WIN32_WINNT 0x0501
#include
#include
BOOL InitApplication(HINSTANCE hinstance);
BOOL InitInstance(HINSTANCE hinstance,int nCmdShow);
LRESULT CALLBACK MainWndProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam);
HINSTANCE hinst; //应用程序实例句柄
HWND hwndMain; //保留窗口句柄
HWND hwndbutton;//按钮
HWND hwndstatic;//静态文字框
HWND hwndedit;//编辑框
int WINAPI WinMain(HINSTANCE hinstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow){
MSG msg;
BOOL fGotMessage;
//注册窗口
if(!InitApplication(hinstance)){
return FALSE;
}
//创建窗口
if(!InitInstance(hinstance,nCmdShow)){
return FALSE;
}
//消息循环
while((fGotMessage = GetMessage(&msg,(HWND)NULL,0,0)) != 0 && fGotMessage != -1){
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
功能很简单,但是代码一点也不少哎.不过这样写代码有助于我们理解程序的执行过程,所以我是比较喜欢用这种方式写代码的.以上就是这篇文章的全部内容了,写的比较小白毕竟自己也是处于学习阶段还写不错高深的内容.