1:鼠标拖动,上次是发消息。
这次的话添加一个OnNcHitTest事件。然后将默认的返回值改为HICAPTION;
2:可以自定义一个窗体来显示自定义的界面。
只需在dlg类的构造函数中
bmpDlg bmpdlg;
bmpdlg.DoModal();
自定义的窗口可以用classwizad生成。也可以直接添加继承与CDialog的类。enum { IDD = IDD_BMPDLG };要和窗体的名字保持一致。
3:首先把整个图片加载进来。然后放到一个区域中将不要的颜色去掉。
CBitmap *cbmoldmem;
//加载图片资源和DC
this->m_cbmAll.LoadBitmapW(IDB_BITMAPALL);
//获得bitmap的基本信息可以通过m_bmAll.bmHeight和m_bmAll.bmWidth获得基本的位图的宽和高。
this->m_cbmAll.GetBitmap(&this->m_bmAll);
//获得window的dc,然后创建一个兼容dc
this->m_cdclpDc=this->GetWindowDC();
this->m_cdclpMemDc->CreateCompatibleDC(this->m_cdclpDc );
//将当前的bitmap选如到memdc中。
cbmoldmem=this->m_cdclpMemDc->SelectObject(&this->m_cbmAll );
//先定义要去掉的颜色
COLORREF transcolor = RGB(140,255,90);
//先定义一个区域该区域
CRgn crgnwnd;
crgnwnd.CreateRectRgn(0,0,0,0);
//通过遍历图片的每一行每一列的像素。如果是和指定颜色一样的话x++,当有颜色不一样时候将当前x坐标记录下来。然后x接着查找下去直到出来和指定颜色一样为止。也就是把需要的颜色先挑出来。然后创建一个区域。和并这个区域到前面的区域。
for(int y=0;y<m_bmAll.bmHeight ;y++)
{
int x=0;
CRgn crgnmem;
do{
int leftx_notranscolor=0;
while(x<m_bmAll.bmWidth &&m_cdclpMemDc->GetPixel(x,y)==transcolor)
{
x++;
}
leftx_notranscolor=x;
while(x<m_bmAll.bmWidth &&m_cdclpMemDc->GetPixel(x,y)!=transcolor)
{
x++;
}
//crgnmem为一个临时的区域。crgnwnd为一个全局区域。crgnmem合并到全局区域后删除。
crgnmem.CreateRectRgn(leftx_notranscolor,y,x,y+1);
crgnwnd.CombineRgn(&crgnwnd,&crgnmem,RGN_OR);
crgnmem.DeleteObject();
}while(x<m_bmAll.bmWidth );
}
//将mem选回来。
this->m_cdclpMemDc->SelectObject(&cbmoldmem);
//设置这块区域
this->SetWindowRgn(crgnwnd,true);
//总是置前显示。
this->SetForegroundWindow();
4:但是这个时候这块区域在去掉多余的边框之后出来的是个灰色的区域(我们只是相当于勾画了一个框架)。我们可以在onpaint中把图片在一个一个的贴上去。
这个时候的图片的话只有在这个区域内的部分才可以显示出来。
m_cbmMem.LoadBitmapW(IDB_BITMAPONE);
m_cbmMem.GetBitmap(&m_bmMemSeparate);
m_cdclpMemDcSeparate->CreateCompatibleDC(this->m_cdclpDc);
m_cdclpMemDcSeparate->SelectObject(&m_cbmMem);
m_cdclpDc->BitBlt(0,0,m_bmMemSeparate.bmWidth,m_bmMemSeparate.bmHeight,m_cdclpMemDcSeparate,0,0,SRCCOPY);
m_cdclpMemDcSeparate->DeleteDC();
m_cbmMem.Detach();
//依次将所有的图片贴上去。
5:可以通过自定义button然后把相应的图片作为他的显示。
在
void bmpButton::PreSubclassWindow()
{
// TODO: 在此添加专用代码和/或调用基类
// this->ModifyStyle(0,BS_OWNERDRAW);
CButton::PreSubclassWindow();
ModifyStyle(NULL, BS_OWNERDRAW);
Invalidate();
}
以及
void bmpButton::DrawItem(LPDRAWITEMSTRUCT lpDIS)
{
CDC *cdcBtDc = CDC::FromHandle(lpDIS->hDC);
CDC *cdcBtMemDc =new CDC();
cdcBtMemDc->CreateCompatibleDC(cdcBtDc);
if(lpDIS->itemState&&ODA_SELECT)
{
cbmBt.LoadBitmapW(idselected);
cbmBt.GetBitmap(&bmBt);
cdcBtMemDc->SelectObject(&cbmBt);
}else
if(m_bbtover||lpDIS->itemState&&ODS_SELECTED)
{
cbmBt.LoadBitmapW(idover);
cbmBt.GetBitmap(&bmBt);
cdcBtMemDc->SelectObject(&cbmBt);
}
else
{
cbmBt.LoadBitmapW(idfocus);
cbmBt.GetBitmap(&bmBt);
cdcBtMemDc->SelectObject(&cbmBt);
}
cdcBtDc->BitBlt(0,0,bmBt.bmWidth,bmBt.bmHeight,cdcBtMemDc,0,0,SRCCOPY);
delete cdcBtMemDc;
cbmBt.Detach();
// TODO: 添加您的代码以绘制指定项
}
其中可以将三张不同的位图先选入设备描述表。然后根据鼠标模式分别显示。
然后在dlg中对图片的显示也很简单。可以
bmpButton *m_bbMyUserName;
bmpButton *m_bbMyPassWord;
然后派生实例(注意我这边自己经常会忘记提醒下)
this->m_bbMyPassWord =new bmpButton();
this->m_bbMyUserName =new bmpButton();
然后通过create的方式先创建一个button
CRect crtBt;
crtBt.left=0;
crtBt.top=0;
crtBt.right=63;
crtBt.bottom=41;
this->m_bbMyUserName->Create(NULL,WS_CHILD|WS_VISIBLE,crtBt,this,IDB_USERNAME);
m_bbMyUserName->setbitmapID(IDB_BITMAPSEVENSIX,IDB_BITMAPSEVENSIXONESELECTED,IDB_BITMAPSEVENSIXONEFOCUS);
m_bbMyUserName->MoveWindow(123,129,63,41);