Вывод строки в окно в АPI

sergeu90

вот у меня такая проблема мне надо было вывести строки,но я для начала хотел попробывать вывести одну строку,но не получаеться помогите вот код,использую виртуальное создание окна для того что бы перерисовывать его что бы когда сворачиваю строка не затиралась так надо по заданию,но не хочет выводиться,если без создания виртуального окна то вывод все хорошо помогите найти ошибку
LRESULT CALLBACK WindowFunc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
HDC hdc;
    char str[250];
    TEXTMETRIC tm;
    SIZE size;
    PAINTSTRUCT paintstruct;
    switch(message)
    {
    case WM_CREATE:
/**получение размеров экрана*///
        maxX=GetSystemMetrics(SM_CXSCREEN);
        maxY=GetSystemMetrics(SM_CYSCREEN);
        /**строим раст совместимый с окном*///
        hdc=GetDC(hwnd);
        memdc=CreateCompatibleDC(hdc);
        hbit=CreateCompatibleBitmap(hdc,maxX,maxY);
        SelectObject(memdc,hbit);
        hBrush=(HBRUSH)GetStockObject(WHITE_BRUSH);
        SelectObject(memdc,hBrush);
        PatBlt(memdc,0,0,maxX,maxY,PATCOPY);
        ReleaseDC(hwnd,hdc);
 
break;
при нажатии на кнопку вывод просиходить должно вывод на экран
case IDM_2:
                {
 
                 SetTextColor(memdc,RGB(0,0,0));
                 SetBkColor(memdc,RGB(0,255,255));
                 GetTextMetrics(memdc,&tm);
                 /***поместить строку в буфер*////
                 sprintf(str,"Высота шрифта %ld пикселов",tm.tmHeight);
                 TextOut(memdc,X,Y,str,strlen(str));
                 
                 InvalidateRect(hwnd,NULL,1);
 
                }
после чего перерисовка
    case WM_PAINT:
            hdc=BeginPaint(hwnd,&paintstruct);
            BitBlt(hdc,0,0,maxX,maxY,memdc,0,0,SRCCOPY);
            EndPaint(hwnd,&paintstruct);
            
            break;
помогите разобраться чего не хочет работать вывод
2 ответа

sergeu90

case WM_CREATE: Вызывается только единожды, при создании окна. case WM_PAINT: Вызывается каждый раз когда требуется перерисовать окно или его часть. case IDM_2: Вызывается черт знает когда, потому как не знаю к чему привязано.Итак, все то что нужно перерисвывать должно жить в PAINT А у тебя: hdc=GetDC(hwnd); memdc=CreateCompatibleDC(hdc); ReleaseDC(hwnd,hdc); и все накрылся memdc ты же уничтожил его привязку освободив hdc.


sergeu90

я уже сдедал ошибка была в том что перерисовку не там вызывал,а так все написано верно