Re: Is there any way to change the background color of a messagebox?
For WM_ERASEBKGND, wParam is the required dc. See http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx
Why do you think that calling SetBkColor() for WM_ERASEBKGND message is going to change the colour of the background? Have you read the article to which I provided a link in post #13?
Re: Is there any way to change the background color of a messagebox?
To change the background colour of a message box as per your original question, try something like this
Code:
#include <iostream>
#include <Windows.h>
using namespace std;
LRESULT CALLBACK CallWndRetProc(int nCode, WPARAM wParam, LPARAM lParam)
{
PCWPRETSTRUCT prs = (PCWPRETSTRUCT)lParam;
HWND md = FindWindow(NULL, "Caption");
if ((md != NULL) && (prs->hwnd == md) && (prs->message == WM_ERASEBKGND)) {
HBRUSH brush = CreateSolidBrush(RGB(255, 0, 0));
RECT rect;
GetClientRect(prs->hwnd, &rect);
FillRect((HDC)prs->wParam, &rect, brush);
DeleteObject(brush);
return TRUE;
}
return CallNextHookEx(NULL, nCode, wParam, lParam);
}
int main()
{
HHOOK oldHook = SetWindowsHookEx(WH_CALLWNDPROCRET, CallWndRetProc, NULL, GetCurrentThreadId());
MessageBox(NULL, "Text", "Caption", MB_OK);
UnhookWindowsHookEx(oldHook);
}
Re: Is there any way to change the background color of a messagebox?
I can't help but notice that the code would be far more maintainable if the OP would simply create his own MessageBox or at least use the system colors/themes.
Re: Is there any way to change the background color of a messagebox?
Quote:
Originally Posted by
Arjay
I can't help but notice that the code would be far more maintainable if the OP would simply create his own MessageBox or at least use the system colors/themes.
True.
Re: Is there any way to change the background color of a messagebox?
Try this (not tested)
Code:
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_DESTROY:
PostQuitMessage(0);
return 0;
case WM_ERASEBKGND:
{
HBRUSH brush = CreateSolidBrush(RGB(255, 0, 0));
RECT rect;
GetClientRect(hwnd, &rect);
FillRect((HDC)wParam, &rect, brush);
DeleteObject(brush);
return TRUE;
}
}
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
Re: Is there any way to change the background color of a messagebox?
First note that WM_CTLCOLORMSGBOX message is discontinued and actually has no use.
However, we can customize a dialog box shown with MessageBox or related functions as follows:
- Before calling MessageBox create a CBT hook.
- In the hook procedure, catch message box window creation and subclass it (assign an app-defined window procedure).
- In the app-defined window procedure associated with the message box, handle WM_CTLCOLORDLG (and other messages if needed).
- Remove the hook procedure when MessageBox exits.
If using MFC, we can override CWinApp::DoMessageBox in order to create a custom message box (based on above steps) when call AfxMessageBox.
See implementation details and demo projects in the following articles: