Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Window _ [] X


Автор: Гость_Alex 22.8.2005, 11:45
Всем привет!


Пытаюсь освоить основы WinAPI. И никак не могу догнать, как сделать свой стиль окна.

Мне надо что бы оно не позволяло изменять размер и кнопочка навесь экран была неактивна.
И где вообще можно почитать про это?

Спасибо smile

Автор: Denn 22.8.2005, 14:37
Петзольд. Программирование для Windows 95.

Автор: Гость_Alex 22.8.2005, 15:53
Другими словами это не возможно?

Или ты пытаешься мне сказать, что это WinAPI первобытный век. Если так то твоё мнение меня не интересует, хочу просто узнать ответ на свой вопрос smile

Автор: Denn 22.8.2005, 16:01
Я ответил на вопрос где можно почитать. Для главного окна стили выставляются в WinMain при инициализации структуры WNDCLASS(EX), а для дочерних в Create(Ex), либо при наследовании дочерних окон.

Кстати книжка чудная хоть и старая конечно.

Автор: Гость_Alex 22.8.2005, 19:57
А можешь примерчик скинуть? smile

Автор: Denn 22.8.2005, 21:52
У меня нету таковых - сам давно MFC юзаю.
Можешь посмотреть на http://www.sources.ru/cpp/winapi/index.html, http://www.codeproject.com.
И здесь можно http://softboard.ru/lofiversion/index.php/t18436.html.

Автор: Гость_Alex 23.8.2005, 00:28
Спасибо smile

А то куда не обратишься, все трыднят, что это старая тема и ничего не знают.

Классный у вас тут форум! smile

Автор: rsm 23.8.2005, 09:36
Спокойствие, нетерпеливый пришелец! smile Тут народ простой, работящий, свободным временем, чтобы писать примеры, не сильно располагает smile

Код

#include <windows.h>

#define WINDOW_CLASS "SimpleWindowClass"

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

void start()
{
    WNDCLASS wc = { 0 };
    HWND hwnd;
    MSG msg;
    HINSTANCE hInst;

    hInst = GetModuleHandle(NULL);

    wc.lpszClassName = WINDOW_CLASS;
    wc.lpfnWndProc = WndProc;
    wc.hInstance = hInst;
    wc.hIcon = LoadIcon(NULL, IDI_WINLOGO);
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground = (HBRUSH) COLOR_WINDOW;

    if (!RegisterClass(&wc))
        ExitProcess(0);

    hwnd = CreateWindow(WINDOW_CLASS, "Window",
        WS_POPUP| WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX | WS_VISIBLE,
        300, 300, 200, 100,  NULL, NULL, hInst, NULL);

    if(!hwnd)
        ExitProcess(0);

    ShowWindow(hwnd, SW_SHOW);
    UpdateWindow(hwnd);

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

    ExitProcess(0);
}

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch (msg)
    {
        case WM_CLOSE:
            PostQuitMessage(0);
            break;
        default:
            return DefWindowProc(hwnd, msg, wParam, lParam);
    }
}

Автор: srd 23.8.2005, 10:01
Небольшое замечание: функция ExitProcess() приводит к завершению приложения. Это API функция, которая ничего не знает о таких фичах языка Си++, как деструкторы и т.д.
Вот пример:
Код

#include <windows.h>

class A
{
public:
    ~A( void )
    {
        MessageBox( NULL, "A::~A()", NULL, MB_OK );
    }
};

int WINAPI WinMain(HINSTANCE,HINSTANCE,LPTSTR,int)
{
    A a;
//    ExitProcess(0);
}

Если расскоментировать строчку с вызовом ExitProcess(), то мы никогда не увидем message box.

Вывод: НИКОГДА НЕ ИСПОЛЬЗУЙТЕ ЭТУ ФУНКЦИЮ В СВОЁМ КОДЕ.

Автор: rsm 23.8.2005, 14:06
Цитата(srd @ 23.8.2005, 12:01)
которая ничего не знает о таких фичах языка Си++

А кто сказал, что я пишу на С++? smile Это Си.

Цитата(srd @ 23.8.2005, 12:01)
НИКОГДА НЕ ИСПОЛЬЗУЙТЕ ЭТУ ФУНКЦИЮ В СВОЁМ КОДЕ

Теоретически, можно было бы написать и return, чтобы просто выйти из функции обратно в дерби ОСи. Это вполне корректно работает в Вин2000. Но где гарантия, что оно же будет нормально работать в других Виндах?

Автор: Leksey 23.8.2005, 14:19
rsm что-то я стобой не совсем согласен.
Как раз return в main штука более универсальная и безопасная и работает не только в Windows любых версий, но и в Unix,Linux...

Автор: srd 23.8.2005, 14:20
Цитата(rsm @ 23.8.2005, 22:06)
А кто сказал, что я пишу на С++?  Это Си.

Очень часто код на Си и Си++ смешивается, и такое поведение Си-части сломает Си++ - часть. Собственно, это я и имел в виду.

Цитата(rsm @ 23.8.2005, 22:06)
Теоретически, можно было бы написать и return, чтобы просто выйти из функции обратно в дерби ОСи. Это вполне корректно работает в Вин2000. Но где гарантия, что оно же будет нормально работать в других Виндах?

Если имеется в виду return из точки входа (main()/WinMain()), то это будет работать на любой версии Винды. А гарантия - то, что твой компилятор а) является компилятором языка Си/Си++, для которого смысл инструкции return вполне определён б) предназначен для разработки Win32-приложений, вот и всё.


Автор: rsm 23.8.2005, 15:56
Цитата(Leksey @ 23.8.2005, 16:19)
Как раз return в main штука более универсальная и безопасная

Цитата(srd @ 23.8.2005, 16:20)
Если имеется в виду return из точки входа (main()/WinMain()), то это будет работать на любой версии Винды.

В моей программе точка входа изменена, сделано это с целью экономии ресурсов - 2 Кб это лучше 9,5 Кб при использовании WinMain.

В общем и целом я согласен и признаю вашу правоту относительно того, что для Си\С++ такой код будет не самым лучшим. Это все тлетворное влияние кодинга на Ассемблере, в котором при ошибке в балансе стэка по ret'у в конце программы вылетаешь чёрт-и куда, но только не куда надо.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)