I have a button in my window and I want to change it’s color using scroll bar. But I have no idea how to change colors of a button using pure WinAPI. There must be a function for it somewhere. Please help resolve this tiny problem.
Printable View
I have a button in my window and I want to change it’s color using scroll bar. But I have no idea how to change colors of a button using pure WinAPI. There must be a function for it somewhere. Please help resolve this tiny problem.
this is from a thread that fordy replied toQuote:
By-Fordy
Code:#include <windows.h>
char g_szClassName[] = "myWindowClass";
HINSTANCE hInst;
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
WNDCLASSEX wc;
HWND hwnd;
MSG Msg;
hInst = hInstance;
//Step 1: Registering the Window Class
wc.cbSize = sizeof(WNDCLASSEX);
wc.style = 0;
wc.lpfnWndProc = WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH);
wc.lpszMenuName = NULL;
wc.lpszClassName = g_szClassName;
wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
if(!RegisterClassEx(&wc))
{
MessageBox(NULL, "Window Registration Failed!", "Error!",
MB_ICONEXCLAMATION | MB_OK);
return 0;
}
// Step 2: Creating the Window
hwnd = CreateWindowEx(
WS_EX_CLIENTEDGE,
g_szClassName,
"The Password Keeper",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, 240, 120,
NULL, NULL, hInstance, NULL);
if(hwnd == NULL)
{
MessageBox(NULL, "Window Creation Failed!", "Error!",
MB_ICONEXCLAMATION | MB_OK);
return 0;
}
ShowWindow(hwnd, nCmdShow);
UpdateWindow(hwnd);
// Step 3: The Message Loop
while(GetMessage(&Msg, NULL, 0, 0) > 0)
{
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
return Msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch(msg)
{
case WM_CLOSE:
DestroyWindow(hwnd);
break;
case WM_CREATE:
//create a default push button
CreateWindowEx( 0, //more or 'extended' styles
TEXT("BUTTON"), //'class' of control to create
TEXT("DEFAULT PUSH BUTTON"), //the control caption
WS_CHILD|WS_VISIBLE|BS_DEFPUSHBUTTON, //control style: how it looks
10, //control position: left
10, //control position: top
200, //control width
30, //control height
hwnd, //parent window handle
NULL, //control's ID
hInst, //application instance
NULL);
//create a push button
CreateWindowEx( 0, //more or 'extended' styles
TEXT("BUTTON"), //'class' of control to create
TEXT("PUSH BUTTON"), //the control caption
WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON, //control style: how it looks
10, //control position: left
50, //control position: top
200, //control width
30, //control height
hwnd, //parent window handle
NULL, //control's ID
hInst, //application instance
NULL);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd, msg, wParam, lParam);
}
return 0;
}
There are some suggestions here.
BTW, Cgawd, the code you posted serves only to create 2 buttons - it won't alter their default appearance at all. :) Anyway, judging by some of the comments in that code, I have a pretty good idea where some of it originally came from... :p ;) :D
edit: typos
it came from fordy, as i said 2 times in that post
:DQuote:
Originally posted by Ken Fitlike
BTW, Cgawd, the code you posted serves only to create 2 buttons - it won't alter their default appearance at all. :) Anyway, judging by some of the comments in that code, I have a pretty good idea where some of it originally came from... :p ;) :D
Often if I do a code example as an answer on this board I use Ken's site for the boilerplate code because its both accessible and reliable and I can quickly add what I want to it.....this is often if I am in work and dont have my templates or the time to do it.....
So yeah....its Ken's code alright!
"Plagiarism is the finest form of flattery"
Yes that information was very useful but I still can't solve my problem. Bitmap buttons will not help at all, and owner-drawn ones are too mesy to play with. I thought that you can use only brushes to change colors of any window component (buttons in this case) at any time while application is running. Please assist.
Yes but you would have to use either of these strategies, or subclass the window and handle all/most of its drawing or design a button object of your own - which you would have to draw anyway.
As I said in the post I originally referred you to regarding WM_CTLCOLORBTN message handling:Usually the WM_CTL* messages work just fine for other controls but not buttons.Quote:
Unfortunately that message doesn't work as described, windows just goes ahead and sets the colour to its default value
>Usually the WM_CTL* messages work just fine for other controls but not buttons.
When you handle the WM_CTLCOLORBTN message, you can change the button's background color, which is hidden behind the button. This is left over from win 3.1 Just FYI :)
>> So yeah....its Ken's code alright!
Ken: It's, uh, Bob's code!
>>When you handle the WM_CTLCOLORBTN message, you can change the button's background color, which is hidden behind the button. This is left over from win 3.1 Just FYI<<
Didn't know that. Thanks. :D Still can't change the button appearance using that message, though. :(
>>Ken: It's, uh, Bob's code!<<
oh, yeah?!? :p