Как создать главное окно без заголовка и бордюра
От: Paul_de_Dupon  
Дата: 14.08.05 12:25
Оценка:
Вроде все просто:

hWnd = CreateWindowEx(0, wnd_class, caption, WS_POPUP, x, y, w, h, parent, NULL, wc.hInstance, NULL);

Но создается окно с клиентской областью меньше на размеры бордюров и вся не клиентская область просто не перерисовывается, т.е. если поводить другим окном сверху моего, то остаются следы не бордюрах и заголовке.

И еще как можно после создания OVERLAPPEDWINDOW сделать его без бордюров и заголовков.

Используется чистый Win32 API

Подскажите пожалуйста!!!
Re: Как создать главное окно без заголовка и бордюра
От: OLEGus1 Россия  
Дата: 15.08.05 05:20
Оценка:
Здравствуйте, Paul_de_Dupon, Вы писали:

P__>И еще как можно после создания OVERLAPPEDWINDOW сделать его без бордюров и заголовков.

Используй WS_OVERLAPPED
Crescite, nos qui vivimus, multiplicamini
Re: Как создать главное окно без заголовка и бордюра
От: OLEGus1 Россия  
Дата: 15.08.05 05:21
Оценка:
Здравствуйте, Paul_de_Dupon, Вы писали:

На всякий случай, из хедера:


#define WS_OVERLAPPEDWINDOW (WS_OVERLAPPED     | \
                             WS_CAPTION        | \
                             WS_SYSMENU        | \
                             WS_THICKFRAME     | \
                             WS_MINIMIZEBOX    | \
                             WS_MAXIMIZEBOX)

#define WS_POPUPWINDOW      (WS_POPUP          | \
                             WS_BORDER         | \
                             WS_SYSMENU)

#define WS_CHILDWINDOW      (WS_CHILD)
Crescite, nos qui vivimus, multiplicamini
Re: Как создать главное окно без заголовка и бордюра
От: gugle  
Дата: 15.08.05 05:31
Оценка:
Здравствуйте, Paul_de_Dupon, Вы писали:

[skip]

Покажите ваш код WNDPROC-функции для вашего класса окна wnd_class
С уважением,
GU Glez [Джи Ю Глиз]
Re[2]: Как создать главное окно без заголовка и бордюра
От: gugle  
Дата: 15.08.05 06:04
Оценка:
Здравствуйте, gugle, Вы писали:

G>Покажите ваш код WNDPROC-функции для вашего класса окна wnd_class


Пока ждал ответа, решил сам программу состряпать :
(обратите внимание на выделенное полужирным ниже)

#include <windows.h>
#include <tchar.h>

HINSTANCE    g_hInstance;
PCTSTR        g_szWndClass = _T("XPC");
HWND        g_hWnd;

LRESULT CALLBACK MainWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch(msg)
    {
    case WM_CREATE:
        return 0;
        break;
    case WM_COMMAND:
        break;
    case WM_DESTROY:
        ::PostQuitMessage(0);
        return 0;
    }

    return ::DefWindowProc(hwnd, msg, wParam, lParam);
}


BOOL CreateMainWindow(int x, int y, int cx, int cy)
{
    WNDCLASSEX        wc = { 0 };
    wc.cbSize        = sizeof wc;
    wc.lpfnWndProc    = MainWndProc;
    wc.hInstance    = g_hInstance;
    wc.lpszClassName= g_szWndClass;

    if (!::RegisterClassEx(&wc))
        return FALSE;

    g_hWnd = ::CreateWindowEx(WS_EX_APPWINDOW, g_szWndClass, _T(""), WS_POPUP | WS_THICKFRAME, x, y, cx, cy, NULL, 0, g_hInstance, 0);
    if (!g_hWnd)
        return FALSE;
}

int WINAPI WinMain(IN HINSTANCE hInstance, IN HINSTANCE hPrevInstance, IN LPSTR lpCmdLine, IN int nShowCmd)
{
    g_hInstance = hInstance;

    if (!CreateMainWindow(10, 10, 300, 200))
        return (MessageBox(0, _T("Can't create The Main Window"), _T("Sorry"), MB_ICONERROR)), -1;

    ::ShowWindow(g_hWnd, SW_SHOW);

    //Input into The Main Loop
    MSG    msg;
    while(::GetMessage(&msg, 0, 0, 0))
    {
        ::TranslateMessage(&msg);
        ::DispatchMessage(&msg);
    }
    DestroyWindow(g_hWnd);

    return 0;
}
С уважением,
GU Glez [Джи Ю Глиз]
Re[3]: Как создать главное окно без заголовка и бордюра
От: gugle  
Дата: 15.08.05 06:09
Оценка:
Здравствуйте, gugle, Вы писали:

G>Пока ждал ответа, решил сам программу состряпать :

G>[skip]

Это просто рабочая заготовка. Думаю, с ней вам будет проще проводит эксперименты
С уважением,
GU Glez [Джи Ю Глиз]
Re: Как создать главное окно без заголовка и бордюра
От: Paul_de_Dupon  
Дата: 15.08.05 20:02
Оценка:
Если интересно ( после того как проблема вроде решена ) WNDPWOC:

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
ASSERT(wnd);
PAINTSTRUCT ps;
HDC hdc;
int x = LOWORD(lParam);
int y = HIWORD(lParam);
switch(uMsg)
{
case WM_CREATE:
break;
case WM_PAINT:
{
hdc = BeginPaint(hwnd, &ps);
ASSERT(hdc);
HDC db_dc = CreateCompatibleDC(hdc);
ASSERT(db_dc);
HBITMAP bmp = CreateCompatibleBitmap(hdc, wnd->w, wnd->h);
ASSERT(bmp);
HBITMAP old = (HBITMAP)SelectObject(db_dc, (HGDIOBJ)bmp);
ASSERT(old != HGDI_ERROR);

wnd->draw(db_dc);

BOOL res = BitBlt(hdc, 0, 0, wnd->w, wnd->h, db_dc, 0, 0, SRCCOPY);
ASSERT(res);

old = (HBITMAP)SelectObject(db_dc, old);
ASSERT(old != HGDI_ERROR);
res = DeleteObject(bmp);
ASSERT(res);
res = DeleteDC(db_dc);
ASSERT(res);
res = EndPaint(hwnd, &ps);
ASSERT(res);
}
break;
//Mouse Event
case WM_LBUTTONDOWN:
HANDLE_MESSAGE(HT_MOUSE_LB_DOWN, (*it)->have_point(x, y), on_lb_down(x, y));
break;
case WM_LBUTTONUP:
HANDLE_MESSAGE(HT_MOUSE_LB_UP, (*it)->have_point(x, y), on_lb_up(x, y));
break;
case WM_RBUTTONDOWN:
HANDLE_MESSAGE(HT_MOUSE_RB_DOWN, (*it)->have_point(x, y), on_rb_down(x, y));
break;
case WM_RBUTTONUP:
HANDLE_MESSAGE(HT_MOUSE_RB_UP, (*it)->have_point(x, y), on_rb_up(x, y));
break;
case WM_MOUSEMOVE:
HANDLE_MESSAGE(HT_MOUSE_MOVE, (*it)->have_point(x, y), on_mouse_move(x, y));
{
Component* cmp_over = wnd->component_from_point(x, y);
if(cmp_over != mouse_over_comp)
{
if(mouse_over_comp && wnd->have_handler(mouse_over_comp, HT_MOUSE_EXIT))
mouse_over_comp->on_mouse_exit(x, y);
mouse_over_comp = cmp_over;
if(mouse_over_comp && wnd->have_handler(mouse_over_comp, HT_MOUSE_ENTER))
mouse_over_comp->on_mouse_enter(x, y);
}
}
break;
//End of Mouse Event
case WM_SIZE:
wnd->synchronize_coords();
break;
//case WM_KEYDOWN:
case WM_MENUCHAR:

//Debug info
#ifdef _DEBUG
{
if(LOWORD(wParam) == 'd')
{
POINT mp;
GetCursorPos(&mp);
ScreenToClient(*wnd, &mp);
Component* c = wnd->component_from_point(mp.x, mp.y);
if(c)
{
Component* p = c->component_from_point(mp.x — c->x(), mp.y — c->y());
if(p)
c = p;
MessageBox(NULL, c->debug_info().c_str(), "Debug Info", MB_OK | MB_ICONINFORMATION);
}
else
{
MessageBox(NULL, wnd->self->debug_info().c_str(), "Debug Info", MB_OK | MB_ICONINFORMATION);
}
}
}
#endif
//End of debug info
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd, uMsg, wParam, lParam);
break;
}
return 0;
}


Спасибо — ключевой момент оказался стиль WS_EX_APPWINDOW, хотя CreateWindowEx(WS_EX_APPWINDOW, ... ,WS_POPUP, ...); ругается GetLastError — Неверный дескриптор окна
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.