PDA

View Full Version : [C++]Colorare un singolo Button


IceCoder
16-01-2008, 00:39
sto impazzendo..devo riuscire a colorare un singolo button di una finestra..ho provato con SetSysColors e ho messo KO tutti i colori del sistema :D

questo è l'ultimo codice che ho provato a scrivere:

case WM_PAINT:
PAINTSTRUCT ps;
POINT p;
HDC hButLoginDC = BeginPaint(hButtonLogin, &ps);
RECT r;
SetBkMode(hButLoginDC, OPAQUE);
GetClientRect(hButtonLogin, &r);
FillRect(hButLoginDC, &r, CreateSolidBrush(RGB(0, 255, 0)));
EndPaint(hButtonLogin, &ps);


break;


eseguendo il programma, ogni volta che viene generato WM_PAINT quel tasto diventa trasparente al 100% :|

vizzz
16-01-2008, 00:45
ma stai subclassando CButton?
http://cowo.supersized.org/archives/11-MFC-colored-CButton.html

IceCoder
16-01-2008, 00:49
non uso MFC, mi piace complicarmi la vita asd

kk3z
16-01-2008, 09:45
Quella roba li la stai facendo nella procedura del pulsante, vero? Lo hai subclassato?

cionci
16-01-2008, 10:39
Quella roba li la stai facendo nella procedura del pulsante, vero? Lo hai subclassato?
Mi sa che sta programmando direttamente con le API Win32 e quella dovrebbe essere una WindowProc.

kk3z
16-01-2008, 10:52
Mi sa che sta programmando direttamente con le API Win32 e quella dovrebbe essere una WindowProc.

(ok, so riconoscere le api e le windowproc :) )
Comunque, l'importante è quale procedura, se lo fa in quella della finestra che contiene il button, è chiaro che non funziona.

IceCoder
16-01-2008, 11:22
(ok, so riconoscere le api e le windowproc :) )
Comunque, l'importante è quale procedura, se lo fa in quella della finestra che contiene il button, è chiaro che non funziona.

si è la windowproc della finestra che contiene il button, e uso direttamente le API di windows..sapete come posso fare?

IceCoder
16-01-2008, 14:35
scusate se faccio un piccolo UP ma sono curioso di capire dove sbaglio O.o

kk3z
16-01-2008, 17:13
Prova questo:

#include <windows.h>

LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);

char szClassName[ ] = "CodeBlocksWindowsApp";

int WINAPI WinMain (HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszArgument, int nCmdShow)
{
HWND hwnd;
MSG messages;
WNDCLASSEX wincl;

wincl.hInstance = hThisInstance;
wincl.lpszClassName = szClassName;
wincl.lpfnWndProc = WindowProcedure;
wincl.style = CS_DBLCLKS;
wincl.cbSize = sizeof (WNDCLASSEX);

wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
wincl.lpszMenuName = NULL;
wincl.cbClsExtra = 0;
wincl.cbWndExtra = 0;
wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;

if (!RegisterClassEx (&wincl))
return 0;

hwnd = CreateWindowEx (
0, /* Extended possibilites for variation */
szClassName, /* Classname */
"Code::Blocks Template Windows App", /* Title Text */
WS_OVERLAPPEDWINDOW, /* default window */
CW_USEDEFAULT, /* Windows decides the position */
CW_USEDEFAULT, /* where the window ends up on the screen */
544, /* The programs width */
375, /* and height in pixels */
HWND_DESKTOP, /* The window is a child-window to desktop */
NULL, /* No menu */
hThisInstance, /* Program Instance handler */
NULL /* No Window Creation data */
);

ShowWindow (hwnd, nCmdShow);

while (GetMessage (&messages, NULL, 0, 0))
{
TranslateMessage(&messages);
DispatchMessage(&messages);
}

return messages.wParam;
}

LRESULT CALLBACK ButtonWindowProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
WNDPROC originalProc = (WNDPROC)GetProp(hwnd, "OriginalProc");

switch(message)
{
case WM_PAINT:
{
RECT r;
GetClientRect(hwnd, &r);

PAINTSTRUCT ps;
HDC hdc = BeginPaint(hwnd, &ps);

FillRect(hdc, &r, CreateSolidBrush(RGB(0, 255, 0)));

char windowText[256];
GetWindowText(hwnd, windowText, 256);

SetBkMode(hdc, TRANSPARENT);
DrawText(hdc, windowText, strlen(windowText), &r, DT_CENTER|DT_VCENTER);

EndPaint(hwnd, &ps);
}
return TRUE;

case WM_MOUSEMOVE:
case WM_LBUTTONDOWN:
case WM_LBUTTONDBLCLK:
case WM_LBUTTONUP:
case WM_RBUTTONDOWN:
case WM_RBUTTONDBLCLK:
case WM_RBUTTONUP:
{
InvalidateRect(hwnd, NULL, TRUE);
}
break;

case WM_DESTROY:
{
SetWindowLong(hwnd, GWL_WNDPROC, (LONG)originalProc);
RemoveProp(hwnd, "OriginalProc");
}
break;
}

return CallWindowProc(originalProc, hwnd, message, wParam, lParam);
}

LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_CREATE:
{
HWND button = CreateWindow("BUTTON", "sono colorato!", WS_CHILD|WS_VISIBLE, 10,10,150,25,
hwnd, 0, GetModuleHandle(0), 0);
SetProp(button, "OriginalProc", (HANDLE)GetWindowLong(button, GWL_WNDPROC));
SetWindowLong(button, GWL_WNDPROC, (LONG)ButtonWindowProc);
}
break;

case WM_DESTROY:
PostQuitMessage (0);
break;

default:
return DefWindowProc (hwnd, message, wParam, lParam);
}

return 0;
}


PS: è davvero una brutta abitudine colorare i pulsanti.