CPaintDC dc(m_hWnd); // 需要先画背景
CBitmap  memBitmap;
CDC      memDC;
memDC.CreateCompatibleDC((HDC)dc);
memBitmap.CreateCompatibleBitmap((HDC)dc, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN));
memDC.SelectBitmap((HBITMAP)memBitmap);

CDC     bkDC;
bkDC.CreateCompatibleDC((HDC)memDC);
bkDC.SelectBitmap((HBITMAP)m_Bitmap);
memDC.BitBlt(0, 0, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN), (HDC)bkDC, 0, 0, SRCCOPY);

CCISBitmap *pBitmap;
for(int i = 0; i < 9; i++)
{
if(i == (iColum*3 + iRow))
{
pBitmap =pSelBitmap;
}
else
{
pBitmap = pUnSelBitamp;
}
pBitmap->DrawTransparent(&memDC, IconPos[i].left, IconPos[i].top, RGB(72, 135, 226), i, ICON_WH);

} dc.BitBlt(0, 0, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN), (HDC)memDC, 0, 0, SRCCOPY);
memDC.SelectBitmap((HBITMAP)NULL);
//::DeleteDC(memDC);                  //前面没有全屏,这里补
DWORD dwState = (SHFS_HIDETASKBAR|SHFS_HIDESTARTICON|SHFS_HIDESIPBUTTON);
SHFullScreen(m_hWnd, dwState); 
CRect rc; 
SetRect(&rc,0,0,GetSystemMetrics(SM_CXSCREEN),GetSystemMetrics(SM_CYSCREEN)); 
SetWindowPos(m_hWnd,0,0,rc.Width(),rc.Height(),SWP_SHOWWINDOW);  return 0;目前OnPaint()函数是这么实现的,图标什么的都能实现,可是前面没有全屏,后面向上移动了一下,结果看着总是有停顿。怎么解决呢?能开始就全屏吗?不要后面补了。系统是wm5的。开始的时候屏幕最上面的状态条没有覆盖。

解决方案 »

  1.   

    你的OnPaint函数内部调用SetWindowPos?建议在OnInitialUpdate之类的函数调用窗口位置设置代码。
      

  2.   

    DWORD dwState = (SHFS_HIDETASKBAR|SHFS_HIDESTARTICON|SHFS_HIDESIPBUTTON);
    SHFullScreen(m_hWnd, dwState);
    CRect rc;
    SetRect(&rc,0,0,GetSystemMetrics(SM_CXSCREEN),GetSystemMetrics(SM_CYSCREEN));
    SetWindowPos(m_hWnd,0,0,rc.Width(),rc.Height(),SWP_SHOWWINDOW);代码放在别的函数中响应
      

  3.   

    这玩意写在OnPaint中,太挫了~~~~肯定会刷死的你就是想一开始就全屏的话,放到PreCreate里面
      

  4.   

    我把这个放到了WM_INITDIALOG的消息事件中,结果不是全屏了。
    有没有什么办法不用这段代码,直接dc.BitBlt(0, 0, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN), (HDC)memDC, 0, 0, SRCCOPY);
    就能全屏?
      

  5.   

    BitBlt只是绘图函数,怎能使窗口全屏呢?参考前面几楼的方法,多google
      

  6.   

    谢谢各位,木有办法啊,后来把:
    DWORD dwState = (SHFS_HIDETASKBAR|SHFS_HIDESTARTICON|SHFS_HIDESIPBUTTON); 
    SHFullScreen(m_hWnd, dwState); 
    CRect rc; 
    SetRect(&rc,0,0,GetSystemMetrics(SM_CXSCREEN),GetSystemMetrics(SM_CYSCREEN)); 
    SetWindowPos(m_hWnd,0,0,rc.Width(),rc.Height(),SWP_SHOWWINDOW); 移动到LRESULT OnEraseBkgnd(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)函数里面,然后就现象就可以忍受了。
      

  7.   

    其实在重载PreCreateWindow就可以最大化得,楼主把问题搞复杂了
    BOOL CXXFrame::PreCreateWindow(CREATESTRUCT& cs)
    {
    if( !CFrameWnd::PreCreateWindow(cs) )
    return FALSE;
    // TODO: Modify the Window class or styles here by modifying
    //  the CREATESTRUCT cs
    cs.x=0;
    cs.y=0;
    cs.cx = ::GetSystemMetrics(SM_CXSCREEN);
    cs.cy = ::GetSystemMetrics(SM_CYSCREEN); return TRUE;
    }
      

  8.   

    先把窗体属性改下呀:DWORD dwExstyle,dwStyle;
    RECT windowrect;
    windowrect.left=(long)0;
    windowrect.top=(long)0;
    windowrect.right=(long)GetSystemMetrics(SM_CXSCREEN);
    windowrect.bottom=(long)GetSystemMetrics(SM_CYSCREEN);
    dwExstyle=WS_EX_APPWINDOW;
    dwStyle=WS_POPUP;AdjustWindowRectEx(&windowrect,dwStyle,false,dwExstyle);
    if(!(hwnd=CreateWindowEx(dwExstyle,
    L"OpenGL",
    L"OpenGL",
    WS_CLIPSIBLINGS|WS_CLIPCHILDREN|dwStyle,
    windowrect.left,
    windowrect.top,
    windowrect.right-windowrect.left,
    windowrect.bottom-windowrect.top,
    NULL,
    NULL,
    hinstance,
    NULL)))
    {

    MessageBox(NULL,L"无法创建窗口",L"OpenGL",MB_OK|MB_ICONSTOP);
    return false;
    }