yzx5126490 2020-02-18 20:46 采纳率: 0%
浏览 511

急---关于TextOut在DC上绘制后丢失问题

【1】我的想法是,创建一个兼容DC,然后在上面画图、写字(鼠标左键点击一下就绘制一遍,一个矩形 + 一行字)。

【2】因为主窗口在<最小化至恢复>时会更新显示区域,我是先在hdcm
上绘制,但不立即更新窗口(不立即InvalidateRect),然后最小化窗口+恢复窗口,来看绘制后的画面。

【3】但结果是,TextOut并没有将字符写到hdcm上(BitBlt后看不到字)!(我测试过,TextOut已正确的执行了),这是为什么呢?

【3+】奇怪的是,如果我在此程序基础上,连续多次的TextOut,则只有最后一条不显示,若我再在最后一条(TextOut)后加上(GetPixel、SetPixel、任意绘图函数...)就没任何丢失了!!!

代码如下:

#include <windows.h>
LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);

DWORD WINAPI yzx(LPVOID asd);//在兼容DC上绘图的(专用)线程

char szClassName[ ]="WTF";
HBITMAP hbitmap;
HDC hdcm;
HANDLE hev;//控制(绘图)线程的开关


int WINAPI WinMain (HINSTANCE hThisInstance,
                    HINSTANCE hPrevInstance,
                    LPSTR lpszArgument,
                    int nFunsterStil)

{
    HWND hwnd;     
    MSG messages;       
    WNDCLASSEX wincl;    

    wincl.hInstance = hThisInstance;
    wincl.lpszClassName = szClassName;
    wincl.lpfnWndProc = WindowProcedure;      
    wincl.style = CS_DBLCLKS;              
    wincl.cbSize = sizeof (WNDCLASSEX);
    wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
    wincl.lpszMenuName = NULL;   
    wincl.cbClsExtra = 0; 
    wincl.cbWndExtra = 0; 
    wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;

    if (!RegisterClassEx (&wincl))
        return 0;

    hwnd = CreateWindowEx (
           0,                
           szClassName,        
           "hjdl",       
           WS_OVERLAPPEDWINDOW,
           0,      
           0,      
           1000,              
           800,                
           HWND_DESKTOP, 
           NULL,              
           hThisInstance,     
           NULL              
           );

    ShowWindow (hwnd, nFunsterStil);

    while (GetMessage (&messages, NULL, 0, 0))
    {
        TranslateMessage(&messages);
        DispatchMessage(&messages);
    }

    return messages.wParam;
}


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

    switch (message)              
    {   
        case WM_CREATE:
                       hdc=GetDC(hwnd);
                       hdcm=CreateCompatibleDC(hdc);
                       hbitmap=CreateCompatibleBitmap(hdc,500,500);
                       SelectObject(hdcm,hbitmap);
                       ReleaseDC(hwnd,hdc);

                       hev=CreateEvent(NULL,0,0,NULL);
                       CreateThread(NULL,0,yzx,hwnd,0,NULL);
                       break;
        case WM_PAINT:
                      hdc=BeginPaint(hwnd,&ps);

                      BitBlt(hdc,0,0,500,500,hdcm,0,0,SRCCOPY);

                      EndPaint(hwnd,&ps);
                      break;

        case WM_LBUTTONUP:

                          SetEvent(hev);

                          break;

        case WM_DESTROY:
                        CloseHandle(hev);
                        DeleteObject(hdcm);
                        DeleteObject(hbitmap);
                        PostQuitMessage (0);       
                        break;
        default:                   
                return DefWindowProc(hwnd, message, wParam, lParam);
    }

    return 0;
}


DWORD WINAPI yzx(LPVOID asd)
{
char temp[111];      
int k=0;

while(1)
{
WaitForSingleObject(hev,INFINITE);

Rectangle(hdcm,0,0,500,500);
sprintf(temp,"%d",++k);
TextOut(hdcm,10,10,temp,strlen(temp));    

}

return 0;      
}
  • 写回答

1条回答 默认 最新

  • dabocaiqq 2020-02-18 22:51
    关注
    评论

报告相同问题?

悬赏问题

  • ¥15 #MATLAB仿真#车辆换道路径规划
  • ¥15 java 操作 elasticsearch 8.1 实现 索引的重建
  • ¥15 数据可视化Python
  • ¥15 要给毕业设计添加扫码登录的功能!!有偿
  • ¥15 kafka 分区副本增加会导致消息丢失或者不可用吗?
  • ¥15 微信公众号自制会员卡没有收款渠道啊
  • ¥15 stable diffusion
  • ¥100 Jenkins自动化部署—悬赏100元
  • ¥15 关于#python#的问题:求帮写python代码
  • ¥20 MATLAB画图图形出现上下震荡的线条