MFC中picture控制元件,將bitmap根據控制元件大小縮放
阿新 • • 發佈:2019-02-13
直接在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%:
......
}