Рисовать фигуры в дочерних окнах

Я работаю над проектом Win32 GUI, в котором у меня есть главное окно, и внутри я отображаю 3 кнопки и 1 ярлык с прикрепленной к нему BITMAP. Как это:
Главное окно

Я объявил массив меток и прикрепил растровое изображение к каждому из них, вот как я это делаю:

/*Loading the bitmaps, creating the backgrounds and the buttons*/
for(i = 0; i <3; i++){
background_bitmaps[i] = (HBITMAP)LoadImage(NULL, background_strings[i], IMAGE_BITMAP, 275, 183, LR_LOADFROMFILE);
background_labels[i] = CreateWindow("STATIC", NULL, WS_CHILD | WS_VISIBLE | SS_BITMAP, 25, 50, 275, 183, hwnd, NULL, hThisInstance, NULL);
tab_buttons[i] = CreateWindow("BUTTON", buttons_strings[i] ,WS_CHILD | WS_VISIBLE, 10 + (50*i), 10, 40, 30, hwnd, NULL, hThisInstance, NULL);
SendMessageW(background_labels[i], STM_SETIMAGE, IMAGE_BITMAP, (LPARAM)background_bitmaps[i]);
}

Фон должен меняться в зависимости от того, какая кнопка нажата, а также от значения переменной с именем value, которая может принимать значения 1, 2 или 4.

Затем я обрабатываю события кнопок следующим образом:

/*  This function is called by the Windows function DispatchMessage()  */
LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam){
switch (message){
value = 0;
case WM_DESTROY:
PostQuitMessage (0);       /* send a WM_QUIT to the message queue */
break;

case WM_COMMAND:
for(i = 0; i<3; i++)
if((HWND)lParam == tab_buttons[i]){
value = 1<<i;
setVisibleBackground(i);
}
break;

default:                      /* for messages that we don't deal with */
return DefWindowProc (hwnd, message, wParam, lParam);
}
return 0;
}

и объявление setVisibleBacground это:

/*Functions declarations*/
void setVisibleBackground(int _value){
for(i = 0; i<3; i++){
bool result = (_value ==  i)?TRUE:FALSE;
ShowWindow(background_labels[i], result);
}
}

До этого момента все работало идеально, но теперь мне нужно, чтобы, когда я нажимаю третью кнопку, чтобы показать 3-й фон, а затем рисую фигуру, например, это может быть прямоугольник или эллипс над фоном.

Я пытаюсь это:

case WM_PAINT:
hDC = BeginPaint(hwnd, &Ps);
EndPaint(hwnd, &Ps);
if(value == 4){
hDC = BeginPaint(background_labels[2], &Ps);
hPen = CreatePen(PS_NULL, 1, RGB(0, 200, 0));
SelectObject(hDC, hPen);
BrushOn = CreateSolidBrush(RGB(31, 127, 0));
SelectObject(hDC, BrushOn);
Ellipse(hDC, 160, 140, 210, 190);
EndPaint(background_labels[2], &Ps);
}
break;

Значение будет равно 4, когда третья кнопка нажата, и я пытаюсь изменить функцию setVisibleBackground следующим образом:

/*Functions declarations*/
void setVisibleBackground(int index){
for(i = 0; i<3; i++){
bool result = (index ==  i)?TRUE:FALSE;
ShowWindow(background_labels[i], result);
}
if( index == 2){
InvalidateRect(background_labels[2], NULL, FALSE);
UpdateWindow(hwnd);
}
}

Но этот код работает только тогда, когда я нажимаю первую и вторую кнопку, изменение фона изменяется, но когда я нажимаю третью кнопку, происходит сбой, сначала он рисует круг, а затем отображает фон над кругом, как в этом изображений

Любая помощь будет оценена

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]