我在写了一个窗口绘画的程序,是类似DirectDraw的类,运行结果吓了我一跳,
一开始运行正常,但过了一会儿后绘画的位置突然到了屏幕的左上面,就好像这个类的hwnd变量为NULL一样,hwnd是初始化这个类的对象时设置的为窗口的句柄,是不是窗口的句柄会变啊,或是我用GetDC()后没有ReleaseDC().
请问这是为什么???

解决方案 »

  1.   

    部分代码:
    int CDisplay::Create(HWND hPwnd, int wi, int he)
    {
    m_main_hwnd = hPwnd;
    m_wnd_width = wi;
    m_wnd_height = he; int i_screen_w = GetSystemMetrics(SM_CXSCREEN);
    int i_screen_h = GetSystemMetrics(SM_CYSCREEN); SetWindowPos(m_main_hwnd, NULL, (i_screen_w - m_wnd_width) / 2, (i_screen_h - m_wnd_height) / 2 - 13, m_wnd_width, m_wnd_height, 0); HDC hdc = ::GetDC(m_main_hwnd); m_memory_dc = CreateCompatibleDC(hdc); m_memory_bitmap = CreateCompatibleBitmap(hdc, m_wnd_width, m_wnd_height); m_surface_back = new CSurface();
    m_surface_back->Create(wi, he);
    m_surface_back->DrawRect(0, 0, wi, he, RGB(0, 0, 0)); SelectObject(m_memory_dc, m_memory_bitmap); ReleaseDC(m_main_hwnd, hdc); return 1;
    }int CDisplay::Present()
    {
    HDC hdc = ::GetDC(m_main_hwnd); BitBlt(hdc, 0, 0, m_wnd_width, m_wnd_height, m_memory_dc, 0, 0, SRCCOPY); ReleaseDC(m_main_hwnd, hdc); return 1;
    }HDC CDisplay::GetDC()
    {
    if(m_main_hwnd == NULL)
    return NULL;
    return ::GetDC(m_main_hwnd);
    }int CGameApp::Create(HWND hwnd)
    {
    m_display = new CDisplay();
    m_display->Create(hwnd, SCREEN_WIDTH, SCREEN_HEIGHT);
    ...
    }int APIENTRY WinMain(HINSTANCE hInstance,
                         HINSTANCE hPrevInstance,
                         LPSTR     lpCmdLine,
                         int       nCmdShow)
    {
    ...
    if(!g_app.Create(g_hWnd))
    return 0;
    }