Не могу нарисовать эллипс нужной кистью

Елена_1990_04

Добрый день. Не могу нарисовать эллипс нужной кистью.Следующие действия приводят к появлению белого круга, а не красного, как хотелось бы.
POINTS ptsBegin;
int z;
HDC hDC;
hDC = GetDC(hwnd); // hwnd - хэндл текущего (единственного) окна
SetDCBrushColor(hDC,RGB(255,0,0));
Ellipse(hDC,ptsBegin.x-z,ptsBegin.y-z,ptsBegin.x+z,ptsBegin.y+z);
Возможно, нужно весь код написать? Скажите, если что. Спасибо.
10 ответов

Елена_1990_04

Конечно весь код


Елена_1990_04

Хорошо. Надеюсь, это не будет никого удручать - разбираться в моем коде. Вот публикую.
#include "windows.h"
#include "windowsx.h"
 
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM,LPARAM);
void MessageProcessing(HWND hwnd, UINT Message, WPARAM wparam,LPARAM lparam);
void MyWinProcessing(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow,MSG msg);
void DestroyProcessing(HWND hwnd, UINT Message, WPARAM wparam,LPARAM lparam);
void PaintProcessing(HWND hwnd, UINT Message, WPARAM wparam,LPARAM lparam);
void LeftButtonUpProcessing(HWND hwnd, UINT Message, WPARAM wparam,LPARAM lparam);
void RightButtonUpProcessing(HWND hwnd, UINT Message, WPARAM wparam,LPARAM lparam);
void LeftButtonDownProcessing(HWND hwnd, UINT Message, WPARAM wparam,LPARAM lparam);
void RightButtonDownProcessing(HWND hwnd, UINT Message, WPARAM wparam,LPARAM lparam);
void MouseMoveProcessing(HWND hwnd, UINT Message, WPARAM wparam,LPARAM lparam);
 
 
int count = 0;
int p = 0,z;
int Pushed = 0;
HBRUSH Brush1;
HMENU hMenu;
char rb = 1;
 
void SetPosWndCenter(HWND curWnd)
{
   int x,y;
   RECT r;
   x = GetSystemMetrics(SM_CXSCREEN);
   y = GetSystemMetrics(SM_CYSCREEN);
   GetClientRect(curWnd,&r);
   x -= (r.right-r.left);
   y -= (r.bottom-r.top);
   x = x/2;
   y = y/2;
   MoveWindow(curWnd,x,y,r.right-r.left,r.bottom-r.top,1);
}
 
void DestroyProcessing(HWND hwnd, UINT Message, WPARAM wparam,LPARAM lparam)
{
   PostQuitMessage(0);
   return 0;
}
 
void LeftButtonDownProcessing(HWND hwnd, UINT Message, WPARAM wparam,LPARAM lparam)
{
   Pushed = 1;
}
 
void PaintProcessing(HWND hwnd, UINT Message, WPARAM wparam,LPARAM lparam)
{
   MoveToEx(GetDC(hwnd),0,0,NULL);
   LineTo(GetDC(hwnd),100,100);
}
 
void LeftButtonUpProcessing(HWND hwnd, UINT Message, WPARAM wparam,LPARAM lparam)
{
   Pushed = 0;
}
 
void MouseMoveProcessing(HWND hwnd, UINT Message, WPARAM wparam,LPARAM lparam)
{
   HDC hDC;
   POINTS ptsBegin;   
   if (Pushed)
   {
        hDC = GetDC(hwnd);
        ptsBegin = MAKEPOINTS(lparam);
        if (rb)
          z = 2 + (p++)%20;
        else
          z = 2 + (p--)%20;
        if (p==20)
          rb = 0;
        if (p==0)
          rb = 1;
        SetDCBrushColor(hDC,RGB(255,0,0));
        Ellipse(hDC,ptsBegin.x-z,ptsBegin.y-z,ptsBegin.x+z,ptsBegin.y+z);
        ExtFloodFill(hDC,ptsBegin.x,ptsBegin.y,RGB(0,255,0),FLOODFILLSURFACE);
   }
}
 
 
void MessageProcessing(HWND hwnd, UINT Message, WPARAM wparam,LPARAM lparam)
{
    switch(Message)
        {
          case WM_DESTROY:  DestroyProcessing(hwnd,Message,wparam,lparam); break;
          case WM_PAINT:  PaintProcessing(hwnd,Message,wparam,lparam); break;
          case WM_LBUTTONDOWN: LeftButtonDownProcessing(hwnd,Message,wparam,lparam); break;
          case WM_LBUTTONUP: LeftButtonUpProcessing(hwnd,Message,wparam,lparam); break;
          case WM_MOUSEMOVE: MouseMoveProcessing(hwnd,Message,wparam,lparam); break;
        }
}
 
void MyWinProcessing(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow,MSG msg)
{
    HWND hwnd;
    WNDCLASS w;
        HBRUSH MyBrush;
 
        MyBrush = CreateSolidBrush(RGB(133,133,133));
 
    memset(&w,0,sizeof(WNDCLASS));
    w.style = CS_HREDRAW | CS_VREDRAW;
    w.lpfnWndProc = WndProc;
    w.hInstance = hInstance;
    w.hbrBackground = MyBrush;//GetStockBrush(WHITE_BRUSH);
    w.lpszClassName = "C Windows";
        w.lpszMenuName  = CreateMenu;
    RegisterClass(&w);
    hwnd = CreateWindow("C Windows","C Windows", WS_OVERLAPPEDWINDOW,
        10,10,400,400,NULL,NULL,hInstance,NULL);
        SetPosWndCenter(hwnd);
    ShowWindow(hwnd,nCmdShow);
    UpdateWindow(hwnd);
        SetWindowText(hwnd,"Push left button and paint!");
    while(GetMessage(&msg,NULL,0,0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
}
 
int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{
    MSG msg;
        MyWinProcessing(hInstance,hPrevInstance,lpCmdLine,nCmdShow,msg);        
    return msg.wParam;
}
 
 
LRESULT CALLBACK WndProc(HWND hwnd, UINT Message, WPARAM wparam,LPARAM lparam)
{
        MessageProcessing(hwnd,Message,wparam,lparam);
        return DefWindowProc(hwnd,Message,wparam,lparam);
}


Елена_1990_04

Какую ошибку выдает компилятор?Поставь на самой верхней строчке:
#define WINVER 0x501
или вот так:
#define _WIN32_WINNT 0x501


Елена_1990_04

Не помогает. Спасибо. Ошибок не выдает компилятор. Просто не вижу нужного результата. Пишу в Билдере 6


Елена_1990_04

Лена, я скомпилировала твой пример у меня все работает. Но с двумя варнингами на этих строчках: ptsBegin = MAKEPOINTS(lparam); return msg.wParam;Но я удалила return 0:
void DestroyProcessing(HWND hwnd, UINT Message, WPARAM wparam,LPARAM lparam)
{
   PostQuitMessage(0);
}
И убрала меню:
w.lpszMenuName  = 0;//CreateMenu;


Елена_1990_04

Красные круги выводятся?


Елена_1990_04

Рисуются белые круги


Елена_1990_04

Понятно. Спасибо. Так вот я хотела бы, чтобы рисовались красные круги. Но не получается(((


Елена_1990_04

Получилось
        hDC = GetDC(hwnd);
        ptsBegin = MAKEPOINTS(lparam);
 
        if (rb)
          z = 2 + (p++)%20;
        else
          z = 2 + (p--)%20;
        if (p==20)
          rb = 0;
        if (p==0)
          rb = 1;
        
        SelectObject(hDC, GetStockObject(DC_BRUSH)); /* !!! ты забыла вот эту строку !!! */
        SetDCBrushColor(hDC,RGB(255,0,0));
        Ellipse(hDC,ptsBegin.x-z,ptsBegin.y-z,ptsBegin.x+z,ptsBegin.y+z);
        ExtFloodFill(hDC,ptsBegin.x,ptsBegin.y,RGB(0,255,0),FLOODFILLSURFACE);


Елена_1990_04

Спасибо тебе большое!