win32控制台中调用win32api和控件资源

1. 调用对话框资源(使用对话框回调函数)

ex.宽字符串逆序输出

// 1. 添加对话框资源
// 2. 添加IDC_EDIT1控件
// 3. 添加以下源文件代码

#include <iostream>
#include <Windows.h>
#include "resource.h"
#include <algorithm>
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\"") 

INT_PTR CALLBACK Dialog1Proc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);

int main()
{
	std::cout << "程序开始" << std::endl;
	system("pause");
	HWND hWnd = CreateDialog(nullptr, MAKEINTRESOURCE(IDD_DIALOG1), nullptr, Dialog1Proc);
	ShowWindow(hWnd, SW_SHOW);
	MSG msg = {};
	while (GetMessage(&msg, nullptr, 0, 0))
	{
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}
	std::cout << "结束" << std::endl;
	system("pause");
	return 0;
}

INT_PTR CALLBACK Dialog1Proc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{// 在回调函数中仍可以对控制台输出
	static TCHAR buffer[256] = {};
	switch (uMsg)
	{
	case WM_INITDIALOG:
		{
			SetWindowText(hDlg, L"String Reversion");
			SetDlgItemText(hDlg, IDOK, L"Reverse");
			SetDlgItemText(hDlg, IDCANCEL, L"Close");
			SetFocus(GetDlgItem(hDlg, IDC_EDIT1));
			SetWindowPos(hDlg, nullptr, 450, 250, 0, 0, SWP_NOSIZE);
		}
		break;
	case WM_COMMAND:
		{
			switch (LOWORD(wParam))
			{
			case IDOK:
				{
					
					GetDlgItemText(hDlg, IDC_EDIT1, buffer, 256);
					std::reverse(buffer, buffer + wcslen(buffer));
					SetDlgItemText(hDlg, IDC_EDIT1, buffer);
				}
				break;
			case IDCANCEL:
				{
					GetDlgItemText(hDlg, IDC_EDIT1, buffer, 256);
					SendMessage(hDlg, WM_SYSCOMMAND, SC_CLOSE, 0);
					return 1;
				}
				break;
			default:
				break;
			}
		}
		break;
	case WM_SYSCOMMAND:
		{
			if (wParam == SC_CLOSE)
			{
				DestroyWindow(hDlg);
				PostQuitMessage(0);// 跳出消息循环
				return 1;
			}
		}
		break;
	default:
		break;
	}
	return 0;
}

2. 同理,可以建立窗口循环,只要把hInstance的地方都换成nullptr即可
ex.Hello World程序
#include <Windows.h>
#include <cmath>

LRESULT CALLBACK WindowProc(
   HWND hwnd,
   UINT uMsg,
   WPARAM wParam,
   LPARAM lParam 
);

//程序入口点
int main()
{
	//1. 设计窗口类。注意"You must fill the structure with the appropriate class attributes before passing it to the function."也就是说结构体的每一个成员不管是否用到,都要赋值。
	WNDCLASS wc;
	wc.cbClsExtra = 0;
	wc.cbWndExtra = 0;
	wc.hCursor = LoadCursor(nullptr, IDC_ARROW);;  
	wc.hIcon = LoadIcon(nullptr, IDI_APPLICATION);;  
	wc.lpszMenuName = NULL;//NULL则没有菜单
	wc.style = CS_HREDRAW | CS_VREDRAW;//窗口的类样式,不是窗口样式WS_XXX,这里是水平重绘和垂直重绘
	wc.hbrBackground = (HBRUSH)COLOR_WINDOW;
	wc.lpfnWndProc = WindowProc;//设置用哪个函数处理消息  
	wc.lpszClassName = L"MyClass";  
	wc.hInstance = nullptr;
	
	//2. 注册窗口类。这样系统才能知道这个窗口类的存在。
	RegisterClass(&wc);

	//3. 创建窗口
	HWND hwnd = CreateWindow(
		L"MyClass",//必须和注册的类名一致
		L"WinForm",
		WS_OVERLAPPEDWINDOW,
		50,//窗口相对父级的x坐标
		50,//窗口相对父级的y坐标
		1000,//窗口宽度
		800,//窗口高度
		NULL,//没有父窗口
		NULL,//没有菜单
		nullptr,//当前应用程序的实例句柄
		NULL//没有附加数据
		);
	//4. 显示窗口
	ShowWindow(hwnd, SW_SHOW);
	//*5. 更新窗口
	UpdateWindow(hwnd);
	//6. 消息循环
	MSG msg;
	while(GetMessage(&msg, NULL, 0, 0))
	{
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}
	return 0;
}

LRESULT CALLBACK WindowProc(
	HWND hwnd,
	UINT uMsg,
	WPARAM wParam,
	LPARAM lParam
	)
{
	switch(uMsg)
	{
	case WM_DESTROY:
		{
			PostQuitMessage(0);
			return 0;
		}
	case WM_PAINT:
		{
			PAINTSTRUCT ps;
			HDC hdc = BeginPaint(hwnd, &ps);
			SelectObject(ps.hdc, (HPEN)GetStockObject(NULL_PEN));
			HBRUSH hbrush = CreateSolidBrush(RGB(255, 125, 12));
			SelectObject(hdc, hbrush);
			POINT pts[3] = {{0, 0}, {500, 0}, {250, 250 * sqrt(3.0)}};
			Polygon(hdc, pts, 3);
			SetBkMode(hdc, TRANSPARENT);
			TextOut(hdc, 220, 125 * sqrt(3) - 40, L"Hello World",wcslen(L"Hello World"));
			EndPaint(hwnd, &ps);
			break;
		}
	default:
		break;
	}
	return DefWindowProc(hwnd, uMsg, wParam, lParam);
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值