鱼C论坛

 找回密码
 立即注册
查看: 2309|回复: 2

关于在兼容DC上使用TextOut丢失问题

[复制链接]
发表于 2020-2-18 21:18:46 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
先上代码:
#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;

    /* Register the window class, and if it fails quit the program */
    if (!RegisterClassEx (&wincl))
        return 0;

    /* The class is registered, let's create the program*/
    hwnd = CreateWindowEx (
           0,                   /* Extended possibilites for variation */
           szClassName,         /* Classname */
           "hjdl",       /* Title Text */
           WS_OVERLAPPEDWINDOW, /* default window */
           0,       /* Windows decides the position */
           0,       /* where the window ends up on the screen */
           1000,                 /* The programs width */
           800,                 /* and height in pixels */
           HWND_DESKTOP,        /* The window is a child-window to desktop */
           NULL,                /* No menu */
           hThisInstance,       /* Program Instance handler */
           NULL                 /* No Window Creation data */
           );

    /* Make the window visible on the screen */
    ShowWindow (hwnd, nFunsterStil);

    /* Run the message loop. It will run until GetMessage() returns 0 */
    while (GetMessage (&messages, NULL, 0, 0))
    {
        /* Translate virtual-key messages into character messages */
        TranslateMessage(&messages);
        /* Send message to WindowProcedure */
        DispatchMessage(&messages);
    }

    /* The program return-value is 0 - The value that PostQuitMessage() gave */
    return messages.wParam;
}


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

    switch (message)                  /* handle the messages */
    {   
        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);       /* send a WM_QUIT to the message queue */
                        break;
        default:        /* for messages that we don't deal with */
                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】我的想法是先在hdcm上绘图(单击鼠标左键一次就绘制一遍),但不立即更新客户区(未立即InvalidateRect)。
【2】在绘制后,先最小化窗口、再恢复窗口(windows应自动更新客户显示区)后,没有看到文字(矩形正常显示)!这是为什么呢?
【3】特别的,若连续使用多条TextOut,则只有最后一条TextOut不显示,其余均正常显示!
                     若在最后一条TextOut后面再加一些函数,如:Rectangle/LineTo/GetPixel/InvilidateRect等等,就全都正常显示了!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-2-18 21:20:29 | 显示全部楼层
困扰了好久,都没弄明白,请大家帮忙看一看。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-19 10:02:26 | 显示全部楼层
...咋没人回答啊?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-21 22:28

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表