本帖最后由 jingyixiaocai 于 2020-1-16 10:15 编辑
先上图片留作纪念
点击按钮1编辑框内容为Hello world按钮退出自然就是退出程序
直接上我写的,有不足之处希望大家多多指点啊:
#include<windows.h>
#include <winuser.h>
#define IDC_Edit 1234
//声明回调函数 typedef LONG_PTR LRESULT;#define CALLBACK __stdcall
//LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
LONG_PTR __stdcall WndProc (HWND, UINT, WPARAM, LPARAM) ; //也行,不是麻烦吗?还是用上面的 主要是解析
//主函数 程序入口
int WINAPI WinMain (HINSTANCE hInstance,//应用程序的实例句柄
HINSTANCE hPrevInstance,
PSTR szCmdLine, //命令行
int iCmdShow) //显示方式
{
static TCHAR szAppName[] = TEXT ("HelloWin") ;
HWND hwnd ; //用来保存成功创建窗口后返回的句柄
MSG msg ; //定义消息结构体变量
WNDCLASS mywnd ; //窗体类
mywnd.style = CS_HREDRAW | CS_VREDRAW ; //指定窗口风格 位置改变时重绘
mywnd.lpfnWndProc = WndProc ; ////函数指针,指向处理窗口消息的函数入口
mywnd.cbClsExtra = 0 ; //结构体后附加的字节数,一般总为0
mywnd.cbWndExtra = 0 ; //窗体实例附加的字节数,一般总为0
mywnd.hInstance = hInstance ; //模块句柄
mywnd.hIcon = LoadIcon (NULL, IDI_APPLICATION) ; //图标句柄 任务栏显示的图标
mywnd.hCursor = LoadCursor (NULL, IDC_ARROW) ; //光标句柄
mywnd.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); //背景颜色COLOR_BACKGROUND
mywnd.lpszMenuName = NULL ; //菜单名的字符串
mywnd.lpszClassName = szAppName ; //自定义类名,不要与其他类名重复
/******************************
1完成 上面属于填表我自己起的名字
填完表格当然是注册啦 注册成功开是营业
********************* ************/
if (!RegisterClass (&mywnd))
{
MessageBox (NULL, TEXT ("注册类失败!"), szAppName, MB_ICONERROR) ;
return 0 ;
}
/******************************
注册成功开是营业 在window上创建窗口和组件
********************* ************/
int x =GetSystemMetrics(SM_CXSCREEN)-300; //x屏幕宽度-程序宽度=程序在右边显示
int y =GetSystemMetrics(SM_CYSCREEN); //y屏幕高度 我直接写0表示运行后在右上角显示
//创建窗体API
hwnd = CreateWindow(szAppName,TEXT("我的第一个C"),WS_CAPTION|WS_SYSMENU|WS_MINIMIZEBOX,x,0,300,400,NULL,NULL,hInstance,NULL);
//这个API11个参数,以后创建按钮我会解析的
//显示窗体的API 传入需要显示的窗体句柄和显示方式
ShowWindow(hwnd,iCmdShow);
//刷新窗体的API
UpdateWindow(hwnd);
//从系统的应用程序线程消息队列中取得一个消息
while(GetMessage(&msg,NULL,0,0) > 0)
{
DispatchMessage(&msg);
}
return msg.wParam;
}
/******************************
下面的东西熟悉么??知道回调函数是神马意思了吧
********************* ************/
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hdc; //句柄
PAINTSTRUCT ps;
RECT rect; //矩形
HINSTANCE hInstance; //窗口实例
static HWND hwndButton[4],hwndEdit; //句柄
//窗口创建也的能退出
switch(message)
{
case WM_CLOSE: //关闭
if(IDYES==MessageBox(hwnd,"是否关闭程序?","提示",MB_YESNO|MB_ICONQUESTION))
{
DestroyWindow (hwnd);
}
return 0;
case WM_DESTROY: //退出程序
PostQuitMessage (0) ;
return 0 ;
case WM_CREATE: //创建按钮
{
hInstance = ((LPCREATESTRUCT)lParam)->hInstance;
//按钮1
hwndButton[0] = CreateWindow("BUTTON",
"按钮1", //按钮标题
WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,
10, // int X8按钮在窗口的左边 Y9 定边 int nWidth100 宽度 int nHeight50 高度
9,
100,
50,
hwnd, //窗口句柄 指向被创建窗口的父窗口或所有者窗口的句柄。若要创建一个子窗口或一个被属窗口,需提供一个有效的窗口句柄。
NULL, //菜单句柄,或依据窗口风格指明一个子窗口标识。
(HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE),//获取应用实例句柄 HANDLE hlnstance,
NULL);//指向一个值的指针,该值传递给窗口WM_CREATE消息 11个参数解析完毕
//练习按钮创建
hwndButton[1] = CreateWindow("BUTTON","按钮退出", WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON, 10,60,100,50,hwnd,NULL,(HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE), NULL);
// hwndButton[2] = CreateWindow("BUTTON","按钮3", WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON, 10,110,100,50,hwnd,NULL,(HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE), NULL);
// hwndButton[3] = CreateWindow("BUTTON","按钮4", WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON, 10,170,100,50,hwnd,NULL,(HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE), NULL);
//这函数很实用啊 1234我开始就声明了
hwndEdit = CreateWindow("Edit", "编辑框", WS_CHILD | WS_VISIBLE | WS_BORDER | ES_MULTILINE, 10, 230, 200, 80, hwnd,(HMENU)1234, NULL, NULL);
return 0;
case WM_COMMAND: //响应按钮消息 完成我们Hello world
if((HWND)lParam == hwndButton[0])
{
SetDlgItemTextA(hwnd, IDC_Edit, "Hello world");
}
if((HWND)lParam == hwndButton[1])
{
DestroyWindow (hwnd);
}
return 0;
}
default:
break;
}
return DefWindowProc (hwnd, message, wParam, lParam) ;
}