我在网上下了个视频,发现了个改变界面的程序,我按照它的做了,界面也出来了,可是发现了一个问题,就是将开发工具最小化时,界面又恢复到了原来的样子, 代码如下:
void CMyDlg::DrawDialog(UINT Flags)
{
    m_FrameHeight   = GetSystemMetrics(SM_CYFIXEDFRAME);
m_BorderHeight  = GetSystemMetrics(SM_CYBORDER);
m_FrameWidth    = GetSystemMetrics(SM_CXFIXEDFRAME);
m_BorderWidth   = GetSystemMetrics(SM_CXBORDER);
m_CaptionHeight = GetSystemMetrics(SM_CYCAPTION); CRect Clientrect;
GetClientRect(Clientrect);
CRect WinRC,FactRC;
GetWindowRect(WinRC);
FactRC.CopyRect(CRect(0,0,WinRC.Width(),WinRC.Height()));
//获取窗口设备上下文
CWindowDC WindowDC(this);
CBitmap LeftLine,*OldObj;
BITMAPINFO bitinfo;
CDC memDC;
memDC.CreateCompatibleDC(&WindowDC);
int leftwidth     = 0; //左标题的宽度
int rightwidth    = 0; //右标题的宽度
int leftlinewidth = 0; //窗体边框和3D宽度
int rLineWidth;
int bLineHeight;
DeleteObject(LeftLine);
LeftLine.LoadBitmap(IDB_RTITLE); //加载右标题
LeftLine.GetObject(sizeof(bitinfo),&bitinfo);
rightwidth = bitinfo.bmiHeader.biWidth;
LeftLine.Detach();
int x,y;
//绘制左边线
//获取位图大小
if(Flags & FLEFTBAR)
{
DeleteObject(LeftLine);
LeftLine.LoadBitmap(IDB_LBAND);
LeftLine.GetObject(sizeof(bitinfo),&bitinfo);
LeftLine.GetObject(sizeof(bitinfo),&bitinfo);
x = bitinfo.bmiHeader.biWidth;
y = bitinfo.bmiHeader.biHeight;
OldObj = memDC.SelectObject(&LeftLine);
//判断位图的宽度与窗体边缘的宽度
leftlinewidth = (x> m_FrameWidth+m_BorderWidth)? x:m_FrameWidth+m_BorderWidth;
WindowDC.StretchBlt(0,m_CaptionHeight,leftlinewidth,
FactRC.Height()-m_CaptionHeight,&memDC,0,0,x,y,SRCCOPY);
memDC.SelectObject(OldObj);
LeftLine.Detach();
}
//绘制左标题
if(Flags & FLEFTTITLE)
{
DeleteObject(LeftLine);
LeftLine.LoadBitmap(IDB_LTITLE);
//获取位图大小
LeftLine.GetObject(sizeof(bitinfo),&bitinfo);
OldObj = memDC.SelectObject(&LeftLine);
leftwidth = x = bitinfo.bmiHeader.biWidth;
y = bitinfo.bmiHeader.biHeight;
m_TitleDrawHeight = (m_CaptionHeight+4 > y) ? m_CaptionHeight+4 : y;
m_LTitleRc.CopyRect(CRect(0,0,x,m_TitleDrawHeight));
WindowDC.StretchBlt(m_LTitleRc.left,m_LTitleRc.top,m_LTitleRc.Width(),
m_LTitleRc.Height(),&memDC,0,0,x,y,SRCCOPY);
memDC.SelectObject(OldObj);
LeftLine.Detach();
}
//绘制右标题
if(Flags & FRIGHTTITLE)
{
DeleteObject(LeftLine);
LeftLine.LoadBitmap(IDB_RTITLE);
//获取位图大小
LeftLine.GetObject(sizeof(bitinfo),&bitinfo);
OldObj = memDC.SelectObject(&LeftLine);
x = bitinfo.bmiHeader.biWidth;
y = bitinfo.bmiHeader.biHeight;
m_TitleDrawHeight = (m_CaptionHeight+4 > y) ? m_CaptionHeight+4 : y;
m_RTitleRc.CopyRect(CRect(FactRC.right-x,0,FactRC.right,m_TitleDrawHeight));
WindowDC.StretchBlt(m_RTitleRc.left,m_RTitleRc.top,m_RTitleRc.Width(),
m_RTitleRc.Height(),&memDC,0,0,x,y,SRCCOPY);
DeleteObject( memDC.SelectObject(OldObj));
LeftLine.Detach();
}
//绘制中间标题
if(Flags & FMIDTITLE)
{
DeleteObject(LeftLine);
LeftLine.LoadBitmap(IDB_MIDTITLE);
//获取位图大小
LeftLine.GetObject(sizeof(bitinfo),&bitinfo);
OldObj = memDC.SelectObject(&LeftLine);
x = bitinfo.bmiHeader.biWidth;
y = bitinfo.bmiHeader.biHeight;
m_TitleDrawHeight = (m_CaptionHeight+4 > y) ? m_CaptionHeight+4 : y;
m_MTitleRc.CopyRect(CRect(m_LTitleRc.right,0,m_RTitleRc.left,m_TitleDrawHeight));
WindowDC.StretchBlt(m_MTitleRc.left,m_MTitleRc.top,m_MTitleRc.Width(),
m_MTitleRc.Height(),&memDC,0,0,x,y,SRCCOPY);
LeftLine.Detach();
memDC.SelectObject(OldObj);
} //绘制右边框
if(Flags & FRIGHTBAR)
{
DeleteObject(LeftLine);
LeftLine.LoadBitmap(IDB_RBAND);
//获取位图大小
LeftLine.GetObject(sizeof(bitinfo),&bitinfo);
OldObj = memDC.SelectObject(&LeftLine);
x = bitinfo.bmiHeader.biWidth;
y = bitinfo.bmiHeader.biHeight;
rLineWidth = m_FrameWidth + m_BorderWidth;
rLineWidth = rLineWidth>x? rLineWidth:x;
WindowDC.StretchBlt(m_RTitleRc.right-rLineWidth,m_TitleDrawHeight,rLineWidth,
FactRC.Height()-m_TitleDrawHeight,&memDC,0,0,x,y,SRCCOPY);
memDC.SelectObject(OldObj);
LeftLine.Detach();
} //绘制底边框
if(Flags & FBOTTOMBAR)
{
DeleteObject(LeftLine);
LeftLine.LoadBitmap(IDB_BBAND);
//获取位图大小
LeftLine.GetObject(sizeof(bitinfo),&bitinfo);
OldObj = memDC.SelectObject(&LeftLine);
x = bitinfo.bmiHeader.biWidth;
y = bitinfo.bmiHeader.biHeight;
bLineHeight = m_BorderHeight + m_FrameHeight;
bLineHeight = bLineHeight>y? bLineHeight:y;
WindowDC.StretchBlt(leftlinewidth,FactRC.Height()-bLineHeight,m_RTitleRc.right
-rLineWidth-leftlinewidth, bLineHeight,&memDC,0,0,x,y,SRCCOPY);
memDC.SelectObject(OldObj);
LeftLine.Detach();
}
//绘制底边框
CPoint pos(30,1);
m_MinRect.CopyRect(CRect(m_RTitleRc.left+pos.x,(m_TitleDrawHeight+2*m_BorderHeight
-m_ButtonHeight)/2+pos.y,m_ButtonWidth,m_ButtonHeight));
pos.x = 55; 
m_MaxRect.CopyRect(CRect(m_RTitleRc.left+pos.x,(m_TitleDrawHeight+2*m_BorderHeight 
-m_ButtonHeight)/2+pos.y,m_ButtonWidth,m_ButtonHeight));
pos.x = 80;
m_CloseRect.CopyRect(CRect(m_RTitleRc.left+pos.x,(m_TitleDrawHeight+2*m_BorderHeight
-m_ButtonHeight)/2+pos.y,m_ButtonWidth,m_ButtonHeight));
//绘制最小化按钮
if(Flags & FMINBUTTON)
{
DeleteObject(LeftLine);
LeftLine.LoadBitmap(IDB_MINBT);
//获取位图大小
LeftLine.GetObject(sizeof(bitinfo),&bitinfo);
OldObj = memDC.SelectObject(&LeftLine);
x = bitinfo.bmiHeader.biWidth;
y = bitinfo.bmiHeader.biHeight;
WindowDC.StretchBlt(m_MinRect.left,m_MinRect.top,m_MinRect.right,
m_MinRect.bottom,&memDC,0,0,x,y,SRCCOPY);
memDC.SelectObject(OldObj);
LeftLine.Detach();
}
//绘制最大化按钮
if ( Flags & FMAXBUTTON)
{
DeleteObject(LeftLine);
LeftLine.LoadBitmap(IDB_MAXBT);
//获取位图大小
LeftLine.GetObject(sizeof(bitinfo),&bitinfo);
OldObj =  memDC.SelectObject(&LeftLine);
x = bitinfo.bmiHeader.biWidth;
y = bitinfo.bmiHeader.biHeight;
WindowDC.StretchBlt(m_MaxRect.left,m_MaxRect.top,m_MaxRect.right,
m_MaxRect.bottom,&memDC,0,0,x,y,SRCCOPY);
memDC.SelectObject(OldObj);
LeftLine.Detach();
}
//绘制关闭按钮
if(Flags & FCLOSEBUTTON)
{
DeleteObject(LeftLine);
LeftLine.LoadBitmap(IDB_CLOSEBT);
//获取位图大小
LeftLine.GetObject(sizeof(bitinfo),&bitinfo);
OldObj = memDC.SelectObject(&LeftLine);
x = bitinfo.bmiHeader.biWidth;
y = bitinfo.bmiHeader.biHeight;
WindowDC.StretchBlt(m_CloseRect.left,m_CloseRect.top,m_CloseRect.right,
m_CloseRect.bottom,&memDC,0,0,x,y,SRCCOPY);
memDC.SelectObject(OldObj);
LeftLine.Detach();
}
LeftLine.DeleteObject();
memDC.DeleteDC();
DrawCaption();
}void CMyDlg::DrawCaption()
{
    if(!m_Caption.IsEmpty())
{
CDC* pDC = GetWindowDC();
pDC->SetBkMode(TRANSPARENT);
pDC->SetTextColor(m_CapitonColor);
pDC->SetTextAlign(TA_CENTER);
CRect rect;
GetClientRect(rect);
pDC->SelectObject(&m_CaptionFont);
pDC->TextOut(rect.Width()/2, m_CaptionHeight/3 ,m_Caption);
ReleaseDC(pDC);
}
}
在onpaint()函数中调用上面的drawdialog函数,出现的问题就是当把另一个程序如word等最小化时,我写的这个程序外观就自动变成了windows的样式,而我做的程序不是windows的样式,标题栏等我用的是图片,可最小化其它程序后,标题栏的图片就不见了,又成蓝色的了

解决方案 »

  1.   

    这两个自绘的函数都要在Onpaint中调用
      

  2.   


    void CMyDlg::OnPaint() 
    {
    if (IsIconic())
    {
    CPaintDC dc(this); // device context for painting SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); // Center icon in client rectangle
    int cxIcon = GetSystemMetrics(SM_CXICON);
    int cyIcon = GetSystemMetrics(SM_CYICON);
    CRect rect;
    GetClientRect(&rect);
    int x = (rect.Width() - cxIcon + 1) / 2;
    int y = (rect.Height() - cyIcon + 1) / 2; // Draw the icon
    dc.DrawIcon(x, y, m_hIcon);
    }
    else
    {
    CDialog::OnPaint();
    }
    DrawDialog(FALL);
    m_IsDrawForm = TRUE;
    }