質問
私は最近、wm_paintを使用してmainwindowの書き込みテキストを持っていますが、今ではそうするのに最適なメッセージではないかもしれないので、別のバージョンを試しています。
MainWindowにはメニューが含まれており、メニュー項目をクリックすると、ID_FILE_PID MSGが送信され、MainWindow(PaintEditsigns関数)の表示テキストとして4つの新しいWindowsを構築します。 4つのWindowsは正常に機能しますが、テキストDOSはまったく機能しません。 O_O
ところで:私が投稿すると、なぜStackoverflowのコードディスプレイがそんなに奇妙に見えるのか、まだ手がかりがありません。なぜこれがなぜですか?
switch(message)
{
case WM_COMMAND:
switch (LOWORD(wParam))
{
case ID_FILE_PID:
{
HWND hWndButton;
HWND hWndEdit;
HWND hWndEdit2;
HWND hWndDisplay;
// drawing the text in mainwindow
trigger=true;
// adding new windows in the mainwindow
hWndButton = CreateWindowEx(0,TEXT("BUTTON"),"Modify",WS_CHILD | WS_VISIBLE |
BS_DEFPUSHBUTTON, 170,56,80,30,hWnd,(HMENU)ID_BUTTON,hThisInstance,NULL);
hWndEdit = CreateWindowEx(0,RICHEDIT_CLASS,TEXT(""),WS_CHILD | WS_VISIBLE | WS_BORDER,
120,30,80,25,hWnd,(HMENU)ID_EDIT,hThisInstance,NULL);
hWndEdit2 = CreateWindowEx(0,RICHEDIT_CLASS,TEXT(""),WS_CHILD | WS_VISIBLE | WS_BORDER,
220,30,80,25,hWnd,(HMENU)ID_EDIT2,hThisInstance,NULL);
hWndDisplay = CreateWindowEx(0,TEXT("STATIC"),NULL,WS_CHILD | WS_VISIBLE | WS_BORDER,
0,100,450,140,hWnd,(HMENU)ID_DISPLAY,hThisInstance,NULL);
UpdateWindow(hWnd);
break;
}
.....
case WM_PAINT:
{
if (trigger) {
paintEditSigns()
}
break;
}
//
// Main function
//
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{
HWND hWnd;
WNDCLASSEX wc;
ZeroMemory(&wc, sizeof(WNDCLASSEX));
hThisInstance = hInstance;
LoadLibrary("Riched20.dll");
wc.cbSize = sizeof(WNDCLASSEX);
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = WindowProc;
wc.hInstance = hInstance;
wc.lpszMenuName = MAKEINTRESOURCE(IDR_MYMENU);
if(!(wc.hIcon = LoadIcon(hInstance,MAKEINTRESOURCE(IDI_MYICON)))) {
HRESULT res = GetLastError();
}
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)COLOR_WINDOW;
wc.lpszClassName = TEXT("testcpp");
RegisterClassEx(&wc);
hWnd = CreateWindowEx(NULL,
wc.lpszClassName,
TEXT("test"),
WS_OVERLAPPEDWINDOW,
300,
200,
450,
300,
NULL,
NULL,
hInstance,
NULL);
ShowWindow(hWnd,nCmdShow);
//paintEditSigns() -- here it works, but not when in the message part
MSG msg;
while (GetMessage(&msg, NULL,0,0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
void paintEditSigns() {
HFONT hf = createFont();
PAINTSTRUCT ps;
HWND hWnd = FindWindow(TEXT("testcpp"),TEXT("test"));
HBRUSH hbruzh = CreateSolidBrush(RGB(0,0,0));
HDC hdz = BeginPaint(hWnd,&ps);
string s = "Memory Address";
SelectBrush(hdz,hbruzh);
SelectFont(hdz,hf);
TextOut(hdz,0,100,s.c_str(),s.length());
EndPaint(hWnd,&ps);
DeleteObject(hbruzh);
}
HFONT createFont() {
HDC hdc;
long lfHeight;
hdc = GetDC(NULL);
lfHeight = -MulDiv(12, GetDeviceCaps(hdc, LOGPIXELSY), 72);
ReleaseDC(NULL, hdc);
HFONT hf = CreateFont(lfHeight, 0, 0, 0, 0, TRUE, 0, 0, 0, 0, 0, 0, 0, "MS Sans Serif");
return hf;
}
解決
あなたはできる それだけ 使用する BeginPaint
/EndPaint
に応答して WM_PAINT
. 。と WM_PAINT
このような絵を描くのに適切な場所です。
Windows呼び出し WM_PAINT
ウィンドウの一部が「無効」されている場合。たとえば、ウィンドウを復元する場合、またはウィンドウの一部が邪魔にならないように窓を移動したり、ウィンドウのサイズを変更した後に表示されます。
ディスプレイを手動で更新する必要がある場合は、電話をかけて再描画する必要がある領域を「無効」します InvalidateRect
(これにより、Windowが再描画する必要がある窓の領域を示します)。
一般的なのは、描画する領域の実際のピクセルに最適な境界を計算する代わりに、ウィンドウ全体を無効にすることです。
所属していません StackOverflow