Windows SDK编程 初学笔记

#include "windows.h"

int WINAPI WinMain(HINSTANCE hinstance, HINSTANCE hPreInstance, PSTR szCmdLine, int iCmdShow) {
	MessageBox(NULL, TEXT("来见见世面"), TEXT("Say Hi"), MB_OK);
	return 0;
}

MessageBox第一个参数为句柄,第二个参数为内容,第三个参数为标题

第四个为现实的按钮,MB_OK代表只显示确定按钮。 

MB_OKCANCEL则代表多一个取消按钮

MB_ABORTRETRYIGNORE代表有以上三个按钮

剩下的也是根据英文意思来进行一个按钮的显示

加上异或可以进行图标的不同显示

#define MB_ICONHAND                 0x00000010L
#define MB_ICONQUESTION             0x00000020L
#define MB_ICONEXCLAMATION          0x00000030L
#define MB_ICONASTERISK             0x00000040L

#if(WINVER >= 0x0400)
#define MB_USERICON                 0x00000080L
#define MB_ICONWARNING              MB_ICONEXCLAMATION
#define MB_ICONERROR                MB_ICONHAND
#endif /* WINVER >= 0x0400 */

#define MB_ICONINFORMATION          MB_ICONASTERISK
#define MB_ICONSTOP                 MB_ICONHAND

MB_DEFBUTTON2代表运行后默认选择在第二项,也就是重试按钮,可以看前面的都是默认选择在第一项,当然MB_DEFBUTTON3的话就会默认选择在第三项,也就是忽略按钮

MessageBox同样也存在返回值

if (MessageBox(hwnd, TEXT("是否结束绘制"), TEXT("提醒"), MB_YESNO) == IDYES) {//通过返回值判断用户选择的按钮类型
	DestroyWindow(hwnd);
}
#define IDOK                1
#define IDCANCEL            2
#define IDABORT             3
#define IDRETRY             4
#define IDIGNORE            5
#define IDYES               6
#define IDNO                7
#if(WINVER >= 0x0400)
#define IDCLOSE         8
#define IDHELP          9
#endif /* WINVER >= 0x0400 */
#if(WINVER >= 0x0500)
#define IDTRYAGAIN      10
#define IDCONTINUE      11
#endif /* WINVER >= 0x0500 */
#if(WINVER >= 0x0501)
#ifndef IDTIMEOUT
#define IDTIMEOUT 32000

#define TEXT(quote) __TEXT(quote)   // r_winnt
#define __TEXT(quote) L##quote      // r_winnt

往TEXT宏内部看,发现可以用L来代替TEXT() 

UE4中同样也是:

FString a = L"111";
GEngine->AddOnScreenDebugMessage(-1, 10.f, FColor::Yellow, a);

MessageBox(NULL, TEXT("123"), TEXT("312"), MB_OK);

但是UE4如何需要使用Windows编程的话必须添加以下头文件:

#include "Windows/AllowWindowsPlatformTypes.h"
#include "Windows/PreWindowsApi.h"
#include <windows.h>
#include "Windows/PostWindowsApi.h"
#include "Windows/HideWindowsPlatformTypes.h"

switch (message) {
	case WM_PAINT://如果消息是绘制
		hdc = BeginPaint(hwnd, &ps);//dc全称为device context = 设备上下文 设备描述表中记录和此设备相关的各种信息,比如对于显示器来说,记录了显示器的尺寸、分辨率,还有当前选择的画笔、画刷、字体等GDI对象的信息。
		GetClientRect(hwnd, &rect);
		DrawText(hdc, TEXT("学习日记!!!"), -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
		EndPaint(hwnd, &ps);
		return 0;

	case WM_LBUTTONDOWN:
		MessageBox(NULL, L"Clicked Window!", L"Hint", MB_OK);
		return 0;

	case WM_CLOSE:
		if (MessageBox(hwnd, TEXT("是否结束绘制"), TEXT("提醒"), MB_YESNO) == IDYES) {//通过返回值判断用户选择的按钮类型
			DestroyWindow(hwnd);
		}
		else {
			return 0;
		}

	case WM_DESTROY://如果消息是结束绘制
		PostQuitMessage(0);
		return 0;
	}

用户点击关闭按钮->发送WM_CLOSE消息->用户判断是否关闭->确认关闭,调用DestroyWindow函数->发送WM_DESTROY消息与WM_NCDESTROY消息->保存数据并清除动态内存->调用PostQuitMessage函数->发送WM_QUIT消息->结束窗口


ASCILL码存在中文乱码问题,Unicode解决了这一问题


窗口编程和控制台编程有所不一样,要把进行一些设置,右键点击,选择属性

将子系统选择为窗口,方能编译成功 


#include "windows.h"

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) {
	HDC hdc;
	PAINTSTRUCT ps;
	RECT rect;

	switch (message) {
	case WM_PAINT://如果消息是绘制
		hdc = BeginPaint(hwnd, &ps);//dc全称为device context = 设备上下文 设备描述表中记录和此设备相关的各种信息,比如对于显示器来说,记录了显示器的尺寸、分辨率,还有当前选择的画笔、画刷、字体等GDI对象的信息。
		GetClientRect(hwnd, &rect);
		DrawText(hdc, TEXT("学习日记!!!"), -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
		EndPaint(hwnd, &ps);
		return 0;

	case WM_LBUTTONDOWN:
		MessageBox(NULL, L"Clicked Window!", L"Hint", MB_OK);
		return 0;

	case WM_CLOSE:
		if (MessageBox(hwnd, TEXT("是否结束绘制"), TEXT("提醒"), MB_YESNO) == IDYES) {//通过返回值判断用户选择的按钮类型
			DestroyWindow(hwnd);
		}
		else {
			hdc = GetDC(hwnd);//第二种获取DC的方式,该方式适合任意场景
			TextOut(hdc, 300, 200, TEXT("已经取消关闭"), 6);//传一个hdc,第二个参数x位置,第三个参数y位置,第四个打印的文本,第五个文本位数,相对于DrawText,该函数可以编辑精准的绘制位置
			ReleaseDC(hwnd, hdc);
			return 0;
		}

	case WM_DESTROY://如果消息是结束绘制
		PostQuitMessage(0);
		return 0;
	}

	return DefWindowProc(hwnd, message, wParam, lParam);
}

int WINAPI WinMain(HINSTANCE hinstance, HINSTANCE hPreInstance, PSTR szCmdLine, int iCmdShow) {
	
	static TCHAR szAppName[] = TEXT("MyWindows");//定义窗口类的名字
	HWND hwnd;//定义窗口句柄
	MSG msg;//定义消息
	WNDCLASS wndclass;//定义窗口类结构

	wndclass.style = CS_HREDRAW | CS_VREDRAW;//让窗口每帧刷新高度和宽度
	wndclass.lpfnWndProc = WndProc;//指定回调函数
	wndclass.cbClsExtra = 0;//多余空间
	wndclass.cbWndExtra = 0;//多余空间
	wndclass.hInstance = hinstance;//赋值实例句柄
	wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);//设置图标
	wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);//设置光标为箭头
	wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);//设置背景颜色
	wndclass.lpszMenuName = NULL;//设置菜单
	wndclass.lpszClassName = szAppName;//设置窗口名字

	if (!RegisterClass(&wndclass)) {//注册窗口
		MessageBox(NULL, TEXT("注册失败"), L"FAILED", MB_ABORTRETRYIGNORE | MB_ICONQUESTION | MB_DEFBUTTON2);
		return 0;
	}

	hwnd = CreateWindow(//调用WndProc函数
		szAppName, 
		TEXT("学习日记"),
		WS_OVERLAPPEDWINDOW,
		CW_USEDEFAULT,
		CW_USEDEFAULT,
		CW_USEDEFAULT,
		CW_USEDEFAULT,
		NULL,
		NULL,
		hinstance,
		NULL
	);

	ShowWindow(hwnd, iCmdShow); //调用WndProc函数
	UpdateWindow(hwnd);//调用WndProc函数

	while (GetMessage(&msg, NULL, 0, 0)) {
		TranslateMessage(&msg);
		DispatchMessage(&msg);//调用WndProc函数
	}

	return	msg.wParam;
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Windows SDK(Software Development Kit)是由微软提供的一套用于开发Windows应用程序的工具资源的集合。它含了开发Windows应用程序所需的编译器、库文件、文档和示例代码等各种资源。通过使用Windows SDK,开发人员可以利用Windows操作系统的功能和特性来创建各种类型的应用程序,包括桌面应用程序、游戏、驱动程序等。引用展示了一个使用Windows SDK开发Windows应用程序的入口函数WinMain,它是程序的入口点,负责初始化应用程序并处理消息循环。引用提到了窗口类(WNDCLASS),它是Windows SDK中的一个结构体,用于定义窗口的属性和行为。通过注册窗口类,开发人员可以告诉操作系统如何创建和处理窗口。引用展示了如何使用SetWindowLong函数来修改窗口的样式,其中hWndBMP表示窗口的句柄,GWL_STYLE表示要修改的窗口样式,nStyle表示要设置的新样式。总之,Windows SDK是开发Windows应用程序所必需的工具和资源集合。它提供了各种功能和资源,帮助开发人员更方便、高效地创建和部署Windows应用程序。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [windows SDK编程简单总结](https://blog.csdn.net/u013677637/article/details/122792160)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值