高DPI的Win32程序示例
来源:互联网 发布:电脑风扇反转软件 编辑:程序博客网 时间:2024/05/16 19:11
效果:
源代码(TEXT("")是可移植字符串,Unicode编译为L"",ANSI编译为""):
// 编译命令:// cl highdpi.cpp /DUNICODE// cl highdpi.cpp /DUNICODE /DNODPI /Felowdpi // 链接指令#pragma comment(lib, "kernel32.lib")#pragma comment(lib, "user32.lib")#pragma comment(lib, "gdi32.lib")#pragma comment(linker, "/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"") // 包含文件#include <windows.h> int g_dpix = 96, g_dpiy = 96; LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam){ PAINTSTRUCT ps; HDC hdc; HFONT hfont, holdfont; TCHAR *str = TEXT("黑体字输出123456ABCDEF示例"); static HWND hbtn1, hbtn2, hbtn3, hbtn4; switch(message) { case WM_CREATE: // 重新设置字体,以应用字体的DPI缩放 SendMessage(hwnd, WM_SETFONT, (WPARAM)GetStockObject(DEFAULT_GUI_FONT), TRUE); // 创建控件,注意DPI缩放方法 hbtn1 = CreateWindowEx(0, TEXT("BUTTON"), TEXT("按钮一"), WS_CHILD|WS_VISIBLE, MulDiv(10, g_dpix, 96), MulDiv(10, g_dpiy, 96), MulDiv(90, g_dpix, 96), MulDiv(30, g_dpiy, 96), hwnd, (HMENU)1, NULL, NULL); hbtn2 = CreateWindowEx(0, TEXT("BUTTON"), TEXT("按钮二"), WS_CHILD|WS_VISIBLE, MulDiv(110, g_dpix, 96), MulDiv(10, g_dpiy, 96), MulDiv(90, g_dpix, 96), MulDiv(30, g_dpiy, 96), hwnd, (HMENU)2, NULL, NULL); hbtn3 = CreateWindowEx(0, TEXT("BUTTON"), TEXT("按钮三"), WS_CHILD|WS_VISIBLE, MulDiv(210, g_dpix, 96), MulDiv(10, g_dpiy, 96), MulDiv(90, g_dpix, 96), MulDiv(30, g_dpiy, 96), hwnd, (HMENU)3, NULL, NULL); hbtn4 = CreateWindowEx(0, TEXT("BUTTON"), TEXT("按钮四"), WS_CHILD|WS_VISIBLE, MulDiv(310, g_dpix, 96), MulDiv(10, g_dpiy, 96), MulDiv(90, g_dpix, 96), MulDiv(30, g_dpiy, 96), hwnd, (HMENU)4, NULL, NULL); // 重新设置字体,以应用字体的DPI缩放 SendMessage(hbtn1, WM_SETFONT, (WPARAM)GetStockObject(DEFAULT_GUI_FONT), TRUE); SendMessage(hbtn2, WM_SETFONT, (WPARAM)GetStockObject(DEFAULT_GUI_FONT), TRUE); SendMessage(hbtn3, WM_SETFONT, (WPARAM)GetStockObject(DEFAULT_GUI_FONT), TRUE); SendMessage(hbtn4, WM_SETFONT, (WPARAM)GetStockObject(DEFAULT_GUI_FONT), TRUE); return 0; case WM_PAINT: hdc = BeginPaint(hwnd, &ps); // 创建字体,注意字体高度的取值(和Word中相同)和缩放 hfont = CreateFont(-MulDiv(16, g_dpiy, 72), 0, 0, 0, FW_THIN, FALSE, FALSE, FALSE, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, FF_DONTCARE, TEXT("SimHei")); holdfont = (HFONT)SelectObject(hdc, hfont); // 输出文字,注意起始位置的缩放 TextOut(hdc, MulDiv(10, g_dpix, 96), MulDiv(50, g_dpiy, 96), str, lstrlen(str)); // 释放资源 SelectObject(hdc, holdfont); DeleteObject(hfont); EndPaint(hwnd, &ps); return 0; case WM_DESTROY: // 退出程序 PostQuitMessage(0); return 0; default: return DefWindowProc(hwnd, message, wParam, lParam); }} int WINAPI WinMain(HINSTANCE hinst, HINSTANCE, LPSTR, int ncmdshow){ // 关闭DPI缩放 FARPROC spdpia = GetProcAddress(GetModuleHandle(TEXT("user32")), "SetProcessDPIAware");#ifndef NODPI if (spdpia != NULL) spdpia(); // 去掉这一句可看到DPI缩放效果#endif // 获取DPI HDC hdc = GetDC(NULL); if (hdc != NULL) { g_dpix = GetDeviceCaps(hdc, LOGPIXELSX); g_dpiy = GetDeviceCaps(hdc, LOGPIXELSY); ReleaseDC(NULL, hdc); } // 注册窗口类 WNDCLASSEX wc = { sizeof wc, CS_VREDRAW|CS_HREDRAW, WndProc, 0, DLGWINDOWEXTRA, NULL, LoadIcon(NULL, IDI_APPLICATION), LoadCursor(NULL, IDC_ARROW), (HBRUSH)GetStockObject(WHITE_BRUSH), NULL, TEXT("MyWndClass"), LoadIcon(NULL, IDI_APPLICATION) }; if (!RegisterClassEx(&wc)) return 1; // 在标题栏显示DPI数值 TCHAR title[200] = TEXT(""); wsprintf(title, TEXT("DPI: %d, %d"), g_dpix, g_dpiy); // 创建窗口,注意DPI缩放方法 HWND hWnd = CreateWindowEx(0, TEXT("MyWndClass"), title, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, MulDiv(500, g_dpix, 96), MulDiv(300, g_dpiy, 96), NULL, NULL, NULL, NULL); // 显示和更新窗口 ShowWindow(hWnd, ncmdshow); UpdateWindow(hWnd); // 消息循环 MSG msg; while (GetMessage(&msg, 0, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return (int)msg.wParam;}如果此程序不需要支持Windows Vista之前的操作系统(如Windows XP),那么调用SetProcessDPIAware时不需要这么麻烦,程序启动时直接SetProcessDPIAware();调用即可。
SetProcessDPIAware这个貌似不需要调用
vc里面在编译选项的manifest里有DPI Aware的设置
窝那个情怀菜单就素这么做的
0 0
- 高DPI的Win32程序示例
- 写一个DPI自适应的Win32程序
- Win32桌面程序为什么要适配高DPI
- 简单Win32程序示例
- MFC程序的DPI适配
- win32下的系统日志钩子示例程序(Delphi 版)
- Windows 高 DPI 的简单总结
- Win32汇编 高DPI下如何获取屏幕物理分辨率(Native solution)
- 写程序都会遇到的问题, DPI
- 图解C# 调用Win32 API 示例程序
- 高斯滤波GaussianBlur函数的使用示例程序
- 关于Windows高DPI
- 高DPI下部分软件显示不全的解决方法
- 关于Windows高DPI的一些简单总结
- 关于Windows高DPI的一些简单总结
- opengl在高DPI屏幕下显示不正常的解决方法.
- Vs2008在高DPI下显示模糊的解决办法
- 关于Windows高DPI的一些简单总结
- 136 - Ugly Numbers
- JAVA音乐播放器(二)(实现列表点击播放)
- HDU2069 & UVA 674 Coin Change(换硬币 dp 入门经典水题,背包问题)
- 悼念512汶川大地震遇难同胞——一定要记住我爱你
- 单例模式:创建独一无二的对象
- 高DPI的Win32程序示例
- C++实验5——数组分离
- Linux内存[翻译]
- 高性能阻塞队列
- More Effective C++----(23)考虑变更程序库
- postgreSQL中函数json_populate_recordset的参数null::myrowtype如何使用
- nyoj18 The Triangle
- 介绍几款AI开源平台
- nyoj 142 管道问题(线段相交问题)