VC++ 绘制矩形并复制到剪贴板,获取字符长度示例
以下为使用 VC++ 绘制一个矩形并将其复制到剪贴板,并使用 GetTextExtent 获取字符长度的代码示例:
#include <Windows.h>
#include <tchar.h>
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
// Register window class
const TCHAR szClassName[] = _T("MyWindowClass");
WNDCLASS wc = { 0 };
wc.lpfnWndProc = WndProc;
wc.hInstance = hInstance;
wc.lpszClassName = szClassName;
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
if (!RegisterClass(&wc)) {
MessageBox(NULL, _T("Window Registration Failed!"), _T("Error"), MB_ICONEXCLAMATION | MB_OK);
return 0;
}
// Create window
HWND hwnd = CreateWindow(szClassName, _T("My Window"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 640, 480, NULL, NULL, hInstance, NULL);
if (hwnd == NULL) {
MessageBox(NULL, _T("Window Creation Failed!"), _T("Error"), MB_ICONEXCLAMATION | MB_OK);
return 0;
}
// Show window
ShowWindow(hwnd, nCmdShow);
UpdateWindow(hwnd);
// Message loop
MSG msg = { 0 };
while (GetMessage(&msg, NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {
switch (msg) {
case WM_PAINT:
// Draw rectangle
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hwnd, &ps);
RECT rect = { 50, 50, 200, 200 };
FillRect(hdc, &rect, (HBRUSH)(COLOR_WINDOW + 1));
EndPaint(hwnd, &ps);
// Copy to clipboard
OpenClipboard(hwnd);
EmptyClipboard();
HBITMAP hBitmap = CreateCompatibleBitmap(hdc, rect.right - rect.left, rect.bottom - rect.top);
HDC hMemDC = CreateCompatibleDC(hdc);
HBITMAP hOldBitmap = (HBITMAP)SelectObject(hMemDC, hBitmap);
BitBlt(hMemDC, 0, 0, rect.right - rect.left, rect.bottom - rect.top, hdc, rect.left, rect.top, SRCCOPY);
SelectObject(hMemDC, hOldBitmap);
SetClipboardData(CF_BITMAP, hBitmap);
CloseClipboard();
// Get character length
HDC hScreenDC = GetDC(NULL);
HFONT hFont = CreateFont(16, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_SWISS, _T("Arial"));
HFONT hOldFont = (HFONT)SelectObject(hScreenDC, hFont);
SIZE size;
GetTextExtentPoint32(hScreenDC, _T("Hello, World!"), _tcslen(_T("Hello, World!")), &size);
SelectObject(hScreenDC, hOldFont);
DeleteObject(hFont);
ReleaseDC(NULL, hScreenDC);
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd, msg, wParam, lParam);
}
该示例使用 CreateCompatibleBitmap 创建一个与屏幕兼容的位图,并使用 BitBlt 将矩形复制到该位图中。然后,使用 SetClipboardData 将位图复制到剪贴板中。最后,使用 GetTextExtentPoint32 在屏幕设备上创建一个字体并获取'Hello, World!'的字符长度。请注意,此代码仅用于演示目的,实际应用程序可能需要进行更多错误检查和资源清理。
原文地址: https://www.cveoy.top/t/topic/nRtx 著作权归作者所有。请勿转载和采集!