//纯API创建窗口 底层代码
#include <windows.h>
//如果出现该符号在函数中被引用需要配置:项目-》属性->配置属性->连接器=》系统  子系统   设置为  窗口 (/SUBSYSTEM:WINDOWS)
//WINAPI代表_stdcall参数的传递顺序,从右到左以此入栈,并且在函数返回前清空堆栈
LRESULT CALLBACK 窗口过程(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM LParam);


//WINAPI代表_stdcall参数的传递顺序,从右到左以此入栈,并且在函数返回前清空堆栈
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow){

	//1.设计窗口
	//2.注册窗口
	//3.创建窗口
	//4.显示和更新
	//5通过循环取消息
	//6处理消息


	//第一步:设计窗口
	WNDCLASS wc;
	wc.cbClsExtra = 0;//类的额外内存
	wc.cbWndExtra = 0;//窗口的额外内存
	wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);//设置背景
	wc.hCursor = LoadCursor(NULL, IDC_HAND);//设置光标 如果第一个参数为null,代表使用系统提供的光标
	wc.hIcon = LoadIcon(NULL, IDI_ERROR);//图标,如果第一个参数为null,代表使用系统提供的光标
	wc.hInstance = hInstance;//实例句柄 传入形参即可
	wc.lpfnWndProc = 窗口过程; //回调函数
	wc.lpszClassName = TEXT("win");//窗口类名
	wc.lpszMenuName = NULL;//菜单名称
	wc.style = 0;//0代表默认风格


	//第二部:注册窗口类
	RegisterClass(&wc);

	//第三部:创建窗口
	HWND hWndParent = CreateWindow("win","窗口标题",WS_OVERLAPPEDWINDOW,50,50,500,500,NULL,NULL,hInstance,NULL);

	//第四部:显示和更新
	ShowWindow(hWndParent, SW_SHOWNORMAL);
	UpdateWindow(hWndParent);

	//第五步:通过循环取消息
	//HWND        hwnd;		主窗口句柄
	//UINT        message;	消息名称
	//WPARAM      wParam;	附加消息 键盘消息
	//LPARAM      lParam;	附加消息 鼠标消息(按键消息)
	//DWORD       time;		消息产生的时间
	//POINT       pt;		附加消息 鼠标消息(位置xy)
	MSG msg;



	while (GetMessage(&msg, NULL, 0, 0))//  参数一:消息指针 参数2:null代表捕获所有窗口 3和4 填写0代表捕获所有消息
	{
		//翻译消息
		TranslateMessage(&msg);//翻译消息是为了处理一些组合按键
		//分发消息
		DispatchMessage(&msg);
	}
	
	return true; 
	
} 



LRESULT CALLBACK 窗口过程(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM LParam){  //消息所处的窗口句柄,具体消息名称 WM_xxxx消息
	switch (uMsg)
	{
		case WM_CLOSE:
			DestroyWindow(hwnd);//销毁窗口 但是不是结束进程,而是发送另一个消息:WM_DESTROY
			break;
		case WM_DESTROY:
			PostQuitMessage(0); //发送退出消息,发完此消息后,在while死循环里 GetMessage() 获取到的就是 false了.就会结束程序!
			break;

		case WM_CREATE:
		{
			LPCREATESTRUCT	pcs = (LPCREATESTRUCT)LParam;
			HWND Hbut1 = CreateWindow("button", "按钮1", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 15, 5, 100, 50, hwnd, (HMENU)1001, pcs->hInstance, NULL);
			HWND Hbut2 = CreateWindow("button", "按钮2", WS_CHILD | WS_VISIBLE | BS_AUTORADIOBUTTON, 15, 100, 100, 50, hwnd, (HMENU)1002, pcs->hInstance, NULL);
			HWND Hbut3 = CreateWindow("button", "按钮3", WS_CHILD | WS_VISIBLE | BS_AUTOCHECKBOX, 15, 200, 100, 50, hwnd, (HMENU)1003, pcs->hInstance, NULL);
			HWND Hbut4 = CreateWindow("button", "按钮4", WS_CHILD | WS_VISIBLE | BS_AUTO3STATE, 15, 300, 100, 50, hwnd, (HMENU)1004, pcs->hInstance, NULL);
			HWND Hbut5 = CreateWindow("button", "图片按钮", WS_CHILD | WS_VISIBLE | BS_BITMAP, 120, 300, 32, 32, hwnd, (HMENU)1005, pcs->hInstance, NULL);
			
		


			HANDLE hBmp = LoadImage(NULL, "D:/c++练习/精通Windows API高级编程_练习/16按钮美化/xxxxxxxx.bmp", IMAGE_BITMAP, 60, 60, LR_LOADFROMFILE);
			SendMessage(Hbut5, BM_SETIMAGE, (WPARAM)IMAGE_BITMAP, (LPARAM)hBmp);
			break;
		}
		case WM_COMMAND:
		{
			WORD id = LOWORD(wParam);//控件id
			WORD code = HIWORD(wParam);//事件,是双击还是单击还是....
			HWND hCtrl = (HWND)LParam;
			if (id==1001 && code==BN_CLICKED) //控件id=1001 且 事件=单击
			{
				MessageBox(hwnd, "按钮1被单击", "提示", MB_OK);
			}
			else if (id == 1002 && code == BN_CLICKED)
			{
				MessageBox(hwnd, "按钮2被单击", "提示", MB_OK);
			}
			else if (id == 1003)
			{	
				if (SendMessage(hCtrl, BM_GETCHECK, 0, 0)==BST_CHECKED)
				{
					MessageBox(hwnd, "复选框被选中", "提示", MB_OK);
				}
				else
				{
					MessageBox(hwnd, "复选框未选中", "提示", MB_OK);
				}
			}
			break;
		}

	}	

	//消息一般都是 WM_开头的,可以从API常量里查询!
	/*返回值用默认的处理方式*/
	return DefWindowProc(hwnd, uMsg, wParam, LParam);
}


相关推荐

MFc(1):c语言/c++ 纯api 创建窗口 底层原理

Visual Studio直接创建一个空项目控件的创建请参考:http://qingzhouquanzi.com/287.html新建一个 后缀为 .c 或者 .cpp文件#include <w

c++控件:api创建按钮 按钮美化

第一步,按钮的创建:普通按钮创建方式HWND Hbut1 = CreateWindow("button", "按钮1", WS_CHILD | WS_VISIB

Windowsapi创建控件 创建窗口

创建按钮一般是在 WM_CREATE消息的响应中创建子窗口 创建控件 创建按钮,创建单选框,复选框 等等按钮的创建:创建按钮第一个参数(类名)必须是 button 不区分大小写case WM_CREA

windowsapi创建窗口 创建 标准控件

窗口的创建参考 http://qingzhouquanzi.com/269.html以下是windows 创建编辑框,文本框,标签,组合框,滚动条等头文件#include <windows.h&

Windowsapi 高频窗口控件函数: 操作控件 创建 取句柄 取标题 取文本 置标题 置文本

Win32API提供了一系列的函数来操作控件高频常用控件函数:类型说明GetDlgItem根据控件ID,取控件句柄GetDlgItemText根据控件ID,取控件文本GetDlgItemInt根据控件

Windowsapi控件:创建超级列表框

超级列表框的类名是 WC_LISTVIEW样式是 LVS_ 开头的LVS_ICON图标视图LVS_SMALLICON小图标视图LVS_LIST列表视图LVS_REPORT报表视图可以向控件发送LVM_

MFc(02):手动使用MFc 创建窗口

新建一个 .h 头文件#include <afxwin.h> /*MFC使用的头文件*/ //CWinApp应用程序类 class MyApp :public CWinApp{

Windowsapi 窗口子类化

什么是子类化?窗口子类化的目的是在不修改现有代码的前提下,扩展现有窗口、控件的功能。它的思路很简单,就是将窗口过程地址修改为一个新函数地址,新的窗口过程函数处理自己感兴趣的消息,将不感兴趣的消息丢给原

Windowsapi:公共控件

Windows中 分为标准控件 和 公共控件标准控件包括:标签,按钮,编辑框,组合框,滚动条,公共控件包括:动画框,日期框,热键框,日历,超级列表框,进度条,超链接,测量条,树形框,分页控件,工具条,

c++ _id取进名() 窗口句柄_取进id() 函数

#include <stdio.h> #include <Windows.h> #include <tlhelp32.h> //进程id取进程名需要次头文件