RT,首先我在OnPaint()函数中改变背景颜色,然后再贴图上去,可是没有成功,开始怀疑是改变背景颜色覆盖了贴上的图片,后来去掉了改变背景颜色的代码,还是不成功。
另外,如果在VC中设置按钮按下,正常,鼠标移上去的图片啊?我试过用捕获鼠标移动消息来贴图的方法,太麻烦了,有没有简便一些的方法啊,另外按钮按下去时,会在按钮的四周产生一个虚线框,大大地影响了美观,有没有办法解决啊
另外,如果在VC中设置按钮按下,正常,鼠标移上去的图片啊?我试过用捕获鼠标移动消息来贴图的方法,太麻烦了,有没有简便一些的方法啊,另外按钮按下去时,会在按钮的四周产生一个虚线框,大大地影响了美观,有没有办法解决啊
解决方案 »
- 求教:CScrollView的垂直滚动条不出现
- def 文件是做什么用的?是系统自己生成 还是需要手写?
- 神呐..大侠救命!rc.exe 错误.
- 几句VB代码用VC怎么写?
- 很简单的基本问题!关于C/S
- 关于控件堆叠的问题
- 在console application中使用CString类型出错
- 在windows API中,有没有那个函数可以直接调用来显示cpu利用率的————请教!!
- 自考所获得的学位证书与国家任务正规在校生所获得的证书一致吗?
- 程序中有多个任务,每个任务都采用一个线程来处理,每隔一定时间重复执行。求帮忙。
- 请问ADO能不能只打开表,不返回记录呀?
- tapi 中使用隐匿窗口时的消息循环怎么写?
至于按钮,可以下载一个CButtonST吧,能满足你的需求
我现在用那个CBitmapButton来做,但出现了一个新的问题
CBitmapButton是动态创建的,我需要得到窗口大小,所以必须在窗口创建后才能创建CBitmapButton
你知道在CFormView中哪 个虚函数是在窗口创建后调用的吗?
BOOL CControlView::OnEraseBkgnd(CDC *pDC)
{
if( m_bitmap.m_hObject != NULL )
{
CDC tempDC;
tempDC.CreateCompatibleDC(pDC);
tempDC.SelectObject( &m_bitmap ); RECT rcClient;
GetClientRect(&rcClient); CRgn rgnBitmap;
CRect rcTmpBmp;//( rcItem );
rcTmpBmp.right = rcClient.right; // We also need to check whether it is the last item
// The update region has to be extended to the bottom if it is
//if( nItem == rCtrlList.GetItemCount() - 1 )
rcTmpBmp.bottom = rcClient.bottom; rgnBitmap.CreateRectRgnIndirect(&rcTmpBmp);
pDC->SelectClipRgn(&rgnBitmap);
rgnBitmap.DeleteObject();
if( pDC->GetDeviceCaps(RASTERCAPS) & RC_PALETTE && m_pal.m_hObject != NULL )
{
pDC->SelectPalette( &m_pal, FALSE );
pDC->RealizePalette();
} //CRect rcFirstItem;
//rCtrlList.GetItemRect(0, rcFirstItem, LVIR_BOUNDS);
for( int i = 0; i < rcClient.right; i += m_cxBitmap )
for( int j = 0; j < rcClient.bottom; j += m_cyBitmap )
pDC->BitBlt( i, j, m_cxBitmap, m_cyBitmap, &tempDC,
0, 0,SRCCOPY );
/*
// Create a pruple brush.
CBrush Brush (RGB (128 , 128 , 128) );
// Select the brush into the device context .
CBrush* pOldBrush = pDC->SelectObject(&Brush);
// Get the area that needs to be erased .
CRect rcClip ;
pDC->GetClipBox(&rcClip);
//Paint the area.
pDC-> PatBlt (rcClip.left , rcClip.top ,
rcClip.Width ( ) , rcClip.Height ( ) , PATCOPY );
//Unselect brush out of device context .
pDC->SelectObject(pOldBrush ); */
}
// Return nonzero to half fruther processing .
return TRUE; }void CControlView::SetBKImage(UINT nIDResource)
{
SetBKImage( (LPCTSTR)nIDResource );
}void CControlView::SetBKImage(LPCTSTR lpszResourceName)
{
if( m_bitmap.m_hObject != NULL )
m_bitmap.DeleteObject();
if( m_pal.m_hObject != NULL )
m_pal.DeleteObject();
HBITMAP hBmp = (HBITMAP)::LoadImage( AfxGetInstanceHandle(),
lpszResourceName, IMAGE_BITMAP, 0,0, LR_CREATEDIBSECTION ); if( hBmp == NULL )
return ; m_bitmap.Attach( hBmp );
BITMAP bm;
m_bitmap.GetBitmap( &bm );
m_cxBitmap = bm.bmWidth;
m_cyBitmap = bm.bmHeight;
// Create a logical palette for the bitmap
DIBSECTION ds;
BITMAPINFOHEADER &bmInfo = ds.dsBmih;
m_bitmap.GetObject( sizeof(ds), &ds ); int nColors = bmInfo.biClrUsed ? bmInfo.biClrUsed : 1 << bmInfo.biBitCount; // Create a halftone palette if colors > 256.
CClientDC dc(NULL); // Desktop DC
if( nColors > 256 )
m_pal.CreateHalftonePalette( &dc );
else
{
// Create the palette RGBQUAD *pRGB = new RGBQUAD[nColors];
CDC memDC;
memDC.CreateCompatibleDC(&dc); memDC.SelectObject( &m_bitmap );
::GetDIBColorTable( memDC, 0, nColors, pRGB ); UINT nSize = sizeof(LOGPALETTE) + (sizeof(PALETTEENTRY) * nColors);
LOGPALETTE *pLP = (LOGPALETTE *) new BYTE[nSize]; pLP->palVersion = 0x300;
pLP->palNumEntries = nColors; for( int i=0; i < nColors; i++)
{
pLP->palPalEntry[i].peRed = pRGB[i].rgbRed;
pLP->palPalEntry[i].peGreen = pRGB[i].rgbGreen;
pLP->palPalEntry[i].peBlue = pRGB[i].rgbBlue;
pLP->palPalEntry[i].peFlags = 0;
} m_pal.CreatePalette( pLP ); delete[] pLP;
delete[] pRGB;
}
Invalidate(); return;
}
void CControlView::OnInitialUpdate()
{
CFormView::OnInitialUpdate();
SetBKImage(IDB_BG26);
//略
}在FormView类中加入变量
CPalette m_pal;
CBitmap m_bitmap;
int m_cxBitmap, m_cyBitmap;我已经应用到实际工程中,祝好运。