1. 程式人生 > >MFC中picture控制元件,將bitmap根據控制元件大小縮放

MFC中picture控制元件,將bitmap根據控制元件大小縮放

直接在OnInitDialog()函式中新增即可;
	CRect rc;
	m_ctrlPic.GetClientRect(&rc);
	CDC* pdcpic = m_ctrlPic.GetDC();  //m_ctrlPic是Picture控制元件的變數  

	CBitmap bitmap1;
	bitmap1.LoadBitmap(IDB_BITMAP_PROTOCOL_3);   //IDB_BITMAP_PROTOCOL_3是要載入的點陣圖的ID  
	BITMAP bmp1;
	bitmap1.GetBitmap(&bmp1);
	CDC memdc;
	memdc.CreateCompatibleDC(pdcpic);
	memdc.SelectObject(&bitmap1);

	CDC ppdc;
	ppdc.CreateCompatibleDC(pdcpic);
	CBitmap bmpbuf;                    //bmpbuf是要放入控制元件中的點陣圖  
	bmpbuf.CreateCompatibleBitmap(pdcpic, rc.right, rc.bottom);
	ppdc.SelectObject(&bmpbuf);

	ppdc.StretchBlt(rc.left, rc.top, rc.Width(), rc.Height(), &memdc, 0, 0, bmp1.bmWidth, bmp1.bmHeight, SRCCOPY);  //將IDB_BITMAP_PROTOCOL_3複製到bmpbuf點陣圖中,並按指定的大小轉換  

	m_ctrlPic.SetBitmap((HBITMAP)bmpbuf.Detach());
	m_ctrlPic.ReleaseDC(pdcpic);
	memdc.DeleteDC();
	ppdc.DeleteDC();

這是在做MFC程式DPI適配中遇到的問題,dpi改變後picture控制元件不會跟著變化,需要將picture控制元件的Center Image屬性設定為TRUE,控制元件才會自動拉伸。然後再新增上面程式碼

但是這樣做的弊端是圖片被縮放後不如原來的清晰,圖片上文字虛化並有毛刺,最後沒有采用該方案;

直接做了幾張不同解析度下的圖,程式碼中判斷dpi進行載入

switch(dpi)

{

case 100%:

setbitmap(100%);

break;

case 120%:

......

}