两个小问题。马上结。 声明一下:问题是SDK,非MFC1、CreateWindow建立的CheckBox怎么能设置背景为透明?2、应该还有个AutoCheckBox,与CheckBox有什么区别?谢谢。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 加上TRANSPARENT属性参数AutoCheckBox 连续单击可以实现选定和被选定,普通的只能选定。 请问怎么设置TRANSPARENT属性? 应该用CButton类创建CheckBox吧,这样就可以设置风格了。 需要用代码设置,因为我是动态创建的。而且不打算用MFC,再次声明一下。 用CreateWindowEx()指定扩展窗体属性 WS_EX_TRANSPARENT to pomelowu(羽战士) and csdn_cht(欣欣兽) 还是没有变化,我就不帖我的程序了,我是在ProgrammingWindows的BTNLOOK.c基础上改的。1、CreateWindowEx时,第一个参数已设为WS_EX_TRANSPARENT,没有效果2、在WM_PAINT事件中加的SetWindowLong( hwndButton[3], GWL_EXSTYLE, WS_EX_TRANSPARENT );仍没有变化。我的意思是,你们给的方法应该是对的,估计是我使用的问题.能否给个完整的程序。 long id = GetWindowLong(hwndButton[3], GWL_EXSTYLE); id &= WS_EX_TRANSPARENT;SetWindowLong(hwndButton[3], GWL_EXSTYLE, id); 还是没有变化,能否给个完整的例子。或者帮我改一下。谢谢了。真的急用。/*-------------------------------------------------------------------------- BTNLOOK.C -- Button Look Program (c) Charles Petzold, 1998---------------------------------------------------------------------------*/#include <windows.h>//#include "res.h"struct{ int iStyle ; TCHAR * szText ;}button[] ={ BS_PUSHBUTTON, TEXT ("PUSHBUTTON"), BS_DEFPUSHBUTTON, TEXT ("DEFPUSHBUTTON"), BS_CHECKBOX, TEXT ("CHECKBOX"), BS_AUTOCHECKBOX, TEXT ("AUTOCHECKBOX"), BS_RADIOBUTTON, TEXT ("RADIOBUTTON"), BS_3STATE, TEXT ("3STATE"), BS_AUTO3STATE, TEXT ("AUTO3STATE"), BS_GROUPBOX, TEXT ("GROUPBOX"), BS_AUTORADIOBUTTON, TEXT ("AUTORADIO"), BS_OWNERDRAW, TEXT ("OWNERDRAW")} ;#define NUM (sizeof button / sizeof button[0])LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow){ static TCHAR szAppName[] = TEXT ("BtnLook") ; HWND hwnd ; MSG msg ; WNDCLASS wndclass ; wndclass.style = CS_HREDRAW | CS_VREDRAW ; wndclass.lpfnWndProc = WndProc ; wndclass.cbClsExtra = 0 ; wndclass.cbWndExtra = 0 ; wndclass.hInstance = hInstance ; wndclass.hIcon = LoadIcon (NULL, (LPTSTR) ((DWORD) ((WORD) (IDI_APPLICATION)))) ; wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ; wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ; wndclass.lpszMenuName = NULL ; wndclass.lpszClassName = szAppName ; if (!RegisterClass (&wndclass)) { MessageBox ( NULL, TEXT ("This program requires Windows NT!"), szAppName, MB_ICONERROR) ; return 0 ; } hwnd = CreateWindow ( szAppName, TEXT ("Button Look"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL) ; ShowWindow (hwnd, iCmdShow) ; UpdateWindow (hwnd) ; while (GetMessage (&msg, NULL, 0, 0)) { TranslateMessage (&msg) ; DispatchMessage (&msg) ; } return msg.wParam ;}LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam){ static HWND hwndButton[NUM] ; static RECT rect ; static TCHAR szTop[] = TEXT ("message wParam lParam"), szUnd[] = TEXT ("_______ ______ ______"), szFormat[] = TEXT ("%-16s%04X-%04X %04X-%04X"), szBuffer[50] ; static int cxChar, cyChar ; long id; HDC hdc ; PAINTSTRUCT ps ; int i ; switch (message) { case WM_CREATE : id = GetWindowLong(hwndButton[3], GWL_EXSTYLE); id &= WS_EX_TRANSPARENT;SetWindowLong(hwndButton[3], GWL_EXSTYLE, id); cxChar = LOWORD (GetDialogBaseUnits ()) ; cyChar = HIWORD (GetDialogBaseUnits ()) ; for (i = 0 ; i < NUM ; i++) //MessageBox( hwnd,"11", "11", MB_OK ); hwndButton[i] = CreateWindowEx (WS_EX_TRANSPARENT, TEXT("button"),button[i].szText, WS_CHILD | WS_VISIBLE | button[i].iStyle, cxChar, cyChar * (1 + 2 * i), 20 * cxChar, 7 * cyChar / 4, hwnd, (HMENU) i, ((LPCREATESTRUCT) lParam)->hInstance, NULL) ; return 0 ; case WM_SIZE : rect.left = 24 * cxChar ; rect.top = 2 * cyChar ; rect.right = LOWORD (lParam) ; rect.bottom = HIWORD (lParam) ; return 0 ; case WM_PAINT : InvalidateRect (hwnd, &rect, TRUE) ; hdc = BeginPaint (hwnd, &ps) ; SelectObject (hdc, GetStockObject (SYSTEM_FIXED_FONT)) ; SetBkMode (hdc, TRANSPARENT) ; TextOut (hdc, 24 * cxChar, cyChar, szTop, lstrlen (szTop)) ; TextOut (hdc, 24 * cxChar, cyChar, szUnd, lstrlen (szUnd)) ; EndPaint (hwnd, &ps) ; return 0 ; case WM_DRAWITEM : case WM_COMMAND : ScrollWindow (hwnd, 0, -cyChar, &rect, &rect) ; hdc = GetDC (hwnd) ; SelectObject (hdc, GetStockObject (SYSTEM_FIXED_FONT)) ; TextOut( hdc, 24 * cxChar, cyChar * (rect.bottom / cyChar - 1), szBuffer, wsprintf (szBuffer, szFormat, message == WM_DRAWITEM ? TEXT ("WM_DRAWITEM") : TEXT ("WM_COMMAND"), HIWORD (wParam), LOWORD (wParam), HIWORD (lParam), LOWORD (lParam))) ; ReleaseDC (hwnd, hdc) ; ValidateRect (hwnd, &rect) ; break ; case WM_DESTROY : PostQuitMessage (0) ; return 0 ; } return DefWindowProc (hwnd, message, wParam, lParam) ;} 这样啊,要不你找一下现成的类来,你这样好像是不能设置成背景透明的。还有一种方法,在xp以上版本可以设置窗体透明;还有一种方法,自己写一个,也不复杂。清楚背景返回true,然后在OnMove中刷新父窗口的相应区域,在OnPaint中绘制你想要的图形,一切都ok了。 参照一下编辑框背景透明的方法处理父窗口的WM_CTLCOLOR消息或者自己处理WM_CTLCOLOR消息返回一个空刷子,试试看应该可以的 //假设你的checkbox在CDialogEx窗口上:HBRUSH CDialogEx::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) { HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor); //Set all checkbox control's background is transparent if( pWnd->GetDlgCtrlID() == IDC_CHECKBOX ) //IDC_CHECKBOX is your checkbox id { pDC->SetBkMode(TRANSPARENT); return (HBRUSH)GetStockObject(NULL_BRUSH); } return hbr;} 关于VS2008中"转到定义(Go to definition) "不起作为的原因及解决办法. 算法求助: 如何将这段代码贴在OnPaint()里面... 初学者,MessageBox显示问题 注册表rgs文件求助 才鸟求windows核心编程 光盘代码一份,学习挂钩dll技能 这个问题不明白! 一个让我烦恼很久的问题???(高手进来) 帮帮我,关于扑克游戏 我已被richeditctrl折腾得不行了,我有些文本要显示,只要求能改变颜色,行距,能该字体最好,谁能给我推荐一个控件,我备有厚礼! 为什么关系国家安全的第二代身份证要让日本企业承包制作 BSTR 输出的问题
AutoCheckBox 连续单击可以实现选定和被选定,普通的只能选定。
指定扩展窗体属性 WS_EX_TRANSPARENT
还是没有变化,我就不帖我的程序了,我是在ProgrammingWindows的BTNLOOK.c基础上改的。
1、CreateWindowEx时,第一个参数已设为WS_EX_TRANSPARENT,没有效果
2、在WM_PAINT事件中加的SetWindowLong( hwndButton[3], GWL_EXSTYLE, WS_EX_TRANSPARENT );仍没有变化。我的意思是,你们给的方法应该是对的,估计是我使用的问题.能否给个完整的程序。
id &= WS_EX_TRANSPARENT;
SetWindowLong(hwndButton[3], GWL_EXSTYLE, id);
BTNLOOK.C -- Button Look Program
(c) Charles Petzold, 1998
---------------------------------------------------------------------------*/#include <windows.h>
//#include "res.h"
struct
{
int iStyle ;
TCHAR * szText ;
}
button[] =
{
BS_PUSHBUTTON, TEXT ("PUSHBUTTON"),
BS_DEFPUSHBUTTON, TEXT ("DEFPUSHBUTTON"),
BS_CHECKBOX, TEXT ("CHECKBOX"),
BS_AUTOCHECKBOX, TEXT ("AUTOCHECKBOX"),
BS_RADIOBUTTON, TEXT ("RADIOBUTTON"),
BS_3STATE, TEXT ("3STATE"),
BS_AUTO3STATE, TEXT ("AUTO3STATE"),
BS_GROUPBOX, TEXT ("GROUPBOX"),
BS_AUTORADIOBUTTON, TEXT ("AUTORADIO"),
BS_OWNERDRAW, TEXT ("OWNERDRAW")
} ;#define NUM (sizeof button / sizeof button[0])
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{
static TCHAR szAppName[] = TEXT ("BtnLook") ;
HWND hwnd ;
MSG msg ;
WNDCLASS wndclass ;
wndclass.style = CS_HREDRAW | CS_VREDRAW ;
wndclass.lpfnWndProc = WndProc ;
wndclass.cbClsExtra = 0 ;
wndclass.cbWndExtra = 0 ;
wndclass.hInstance = hInstance ;
wndclass.hIcon = LoadIcon (NULL, (LPTSTR) ((DWORD) ((WORD) (IDI_APPLICATION)))) ;
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;
wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
wndclass.lpszMenuName = NULL ;
wndclass.lpszClassName = szAppName ;
if (!RegisterClass (&wndclass))
{
MessageBox ( NULL, TEXT ("This program requires Windows NT!"),
szAppName, MB_ICONERROR) ;
return 0 ;
}
hwnd = CreateWindow ( szAppName, TEXT ("Button Look"),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT,
NULL, NULL, hInstance, NULL) ; ShowWindow (hwnd, iCmdShow) ;
UpdateWindow (hwnd) ; while (GetMessage (&msg, NULL, 0, 0))
{
TranslateMessage (&msg) ;
DispatchMessage (&msg) ;
}
return msg.wParam ;
}LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
static HWND hwndButton[NUM] ;
static RECT rect ;
static TCHAR szTop[] = TEXT ("message wParam lParam"),
szUnd[] = TEXT ("_______ ______ ______"),
szFormat[] = TEXT ("%-16s%04X-%04X %04X-%04X"),
szBuffer[50] ;
static int cxChar, cyChar ;
long id;
HDC hdc ;
PAINTSTRUCT ps ;
int i ;
switch (message)
{
case WM_CREATE :
id = GetWindowLong(hwndButton[3], GWL_EXSTYLE);
id &= WS_EX_TRANSPARENT;
SetWindowLong(hwndButton[3], GWL_EXSTYLE, id);
cxChar = LOWORD (GetDialogBaseUnits ()) ;
cyChar = HIWORD (GetDialogBaseUnits ()) ;
for (i = 0 ; i < NUM ; i++)
//MessageBox( hwnd,"11", "11", MB_OK );
hwndButton[i] = CreateWindowEx (WS_EX_TRANSPARENT
, TEXT("button"),button[i].szText,
WS_CHILD | WS_VISIBLE | button[i].iStyle,
cxChar, cyChar * (1 + 2 * i),
20 * cxChar, 7 * cyChar / 4,
hwnd, (HMENU) i,
((LPCREATESTRUCT) lParam)->hInstance, NULL) ;
return 0 ; case WM_SIZE :
rect.left = 24 * cxChar ;
rect.top = 2 * cyChar ;
rect.right = LOWORD (lParam) ;
rect.bottom = HIWORD (lParam) ;
return 0 ;
case WM_PAINT :
InvalidateRect (hwnd, &rect, TRUE) ;
hdc = BeginPaint (hwnd, &ps) ;
SelectObject (hdc, GetStockObject (SYSTEM_FIXED_FONT)) ;
SetBkMode (hdc, TRANSPARENT) ;
TextOut (hdc, 24 * cxChar, cyChar, szTop, lstrlen (szTop)) ;
TextOut (hdc, 24 * cxChar, cyChar, szUnd, lstrlen (szUnd)) ;
EndPaint (hwnd, &ps) ;
return 0 ;
case WM_DRAWITEM :
case WM_COMMAND :
ScrollWindow (hwnd, 0, -cyChar, &rect, &rect) ;
hdc = GetDC (hwnd) ;
SelectObject (hdc, GetStockObject (SYSTEM_FIXED_FONT)) ;
TextOut( hdc, 24 * cxChar, cyChar * (rect.bottom / cyChar - 1),
szBuffer,
wsprintf (szBuffer, szFormat,
message == WM_DRAWITEM ? TEXT ("WM_DRAWITEM") :
TEXT ("WM_COMMAND"),
HIWORD (wParam), LOWORD (wParam),
HIWORD (lParam), LOWORD (lParam))) ;
ReleaseDC (hwnd, hdc) ;
ValidateRect (hwnd, &rect) ;
break ;
case WM_DESTROY :
PostQuitMessage (0) ;
return 0 ;
}
return DefWindowProc (hwnd, message, wParam, lParam) ;
}
还有一种方法,在xp以上版本可以设置窗体透明;
还有一种方法,自己写一个,也不复杂。清楚背景返回true,然后在OnMove中刷新父窗口的相应区域,在OnPaint中绘制你想要的图形,一切都ok了。
或者自己处理WM_CTLCOLOR消息返回一个空刷子,试试看
应该可以的
HBRUSH CDialogEx::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
//Set all checkbox control's background is transparent
if( pWnd->GetDlgCtrlID() == IDC_CHECKBOX ) //IDC_CHECKBOX is your checkbox id
{
pDC->SetBkMode(TRANSPARENT);
return (HBRUSH)GetStockObject(NULL_BRUSH);
}
return hbr;
}