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.
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.
C++ rulez!!!
this is from a thread that fordy replied toBy-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...
edit: typos
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...
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.
C++ rulez!!!
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.Unfortunately that message doesn't work as described, windows just goes ahead and sets the colour to its default value
CProgramming FAQ
Caution: this person may be a carrier of the misinformation virus.
>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. Still can't change the button appearance using that message, though.
>>Ken: It's, uh, Bob's code!<<
oh, yeah?!?
CProgramming FAQ
Caution: this person may be a carrier of the misinformation virus.