(eVC++ 4.0) Transparent/bitmap background ko dùng MFC

pocket me

New member
GÂY DỰNG
Đ/c nào thành thạo vấn đề này xin chỉ giáo giúp! (Với các ngôn ngữ khác, việc này rất đơn giản, nhưng sao eVC lại khó khăn thế nhỉ #-o ).
Tớ viết 1 app không dùng MFC, design 1 dialog có 1 static control và 1 edit box bằng resource editor. WinProc của dialog viết trong file nguồn để GetMessage. Dialog có vẽ 1 static bitmap làm background, bây giờ phải làm sao để background của static control và edit box thành transparent???
Tớ đã google nhiều rồi, có rất nhiều sample code về chuyện này nhưng lại toàn sử dụng MFC. Cũng lạ là sao thằng MSDN không có hướng dẫn về vấn đề này nhỉ?
Đ/c nào có thể giúp tớ 1 đoạn code để xử lý vấn đề này với! Xin chân thành cảm ơn!
 
Để có background của static control trở thành transparent, có một cách là bác vẽ lại static control đó:
- Set style cho STC là SS_OWNERDRAW;
- Đón message WM_DRAWITEM tại WndProc của control chứa STC (ở đây là DlgProc).
- Thực hiện vẽ lại chuỗi text của STC: trước khi vẽ cần đặt BkMode là TRANSPARENT:
Mã:
TCHAR szCaption[255];

LPDRAWITEMSTRUCT lpDrawItem = (LPDRAWITEMSTRUCT)lParam;
GetDlgItemText(hDlg, lpDrawItem->CtlID, szCaption, 255);

SetBkMode(lpDrawItem->hDC, TRANSPARENT);
SetTextColor(lpDrawItem->hDC, RGB(0,230,0));        //Đặt màu vẽ

DrawText(lpDrawItem->hDC, szCaption, lstrlen(szCaption), 
	&lpDrawItem->rcItem, DT_CENTER | DT_VCENTER);
Bác có thể dùng kỹ thuật subclass để code đơn giản hơn khi cần áp dụng với nhiều control.

Còn cách nào khác xin mọi người đóng góp.
 
Tuyệt lắm, cảm ơn đ/c nhiều. Nếu có thể, đ/c cho phép trao đổi thêm 1 tý nhé: trong 1 dialog - có chứa transparent background controls (dùng WM_DRAWITEM) - để hiển thị 1 bitmap làm nền cho dialog thì dùng phương pháp nào hiệu quả nhất và tránh flicker. Hiện giờ, tớ dùng picture box trong resource (static với SS_BITMAP) -> cách này hơn hay là tự vẽ trong WM_PAINT hay WM_ERASEBKGROUND?
 
Back
Top