Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Создание простейшого АПИ окна


Автор: Sergio 7.3.2007, 23:15
Здраствуйте. Хочу создать простое окно для будущего вывода графики в нём. Вот что я написал Что то упустил. Помогите плз:
Код

#include <windows.h>
ATOM RegMyWindowClass(HINSTANCE, LPCTSTR);

int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR lpCmdLine,
                     int nCmdShow)
{
    // имя будущего класса
  LPCTSTR lpzClass = TEXT("My Window Class!");

  // регистрация класса
  if (!RegMyWindowClass(hInstance, lpzClass))
    return 1;

     // создание диалогового окна
  HWND hWnd = CreateWindow(lpzClass, TEXT("Dialog Window"), 
            WS_OVERLAPPEDWINDOW | WS_VISIBLE, 100, 100, 300, 150, NULL, NULL, hInstance, NULL);
  return 0;
}

Ссылался на этот урок: http://www.rsdn.ru/article/baseserv/api32.xml

Автор: Aleksandor 8.3.2007, 10:41
Извиняюсь, а где же цикл обработки сообщений? Там .в статье, он присутствует  smile 

Автор: Sergio 8.3.2007, 21:12
Aleksandor, Я не хочу никаких циклов обработки сообщений. Мне это не нужно. Хочу только создать окно и всё. 

Автор: GremlinProg 8.3.2007, 21:35
) этот цикл как раз и обрабатывает сообщения окна, т.е., собственно и позволяет окну появиться на экране и манипулировать им.

Если тебе не нужен этот цикл, используй для создания диалогового окна функцию DialogBox, эта функция сама организует упомянутый цикл и вернет результат в WinMain только после закрытия окна.

Автор: drZmeu 9.3.2007, 09:19
А где регистрация класса?
Где ShowWindows, UpdateWindow ,,???,,
Приём месаг ? smile 

Автор: 586 9.3.2007, 11:41
Цитата(Sergio @  8.3.2007,  21:12 Найти цитируемый пост)
Я не хочу никаких циклов обработки сообщений. Мне это не нужно. Хочу только создать окно и всё

Такое прокатит, если создаёшь дочернее окно в окне, или второе окно - тогда не нужен цикл обработки сообщений. Но один цикл обработки сообщений должен быть в программе полюбому.
Код
MSG msg;
// создание окна
while(GetMessage(&msg, 0, 0, 0))
{
   TranslateMessage(&msg);
   DispatchMessage(&msg);
}

Автор: drZmeu 9.3.2007, 13:47
Ну вопервых окно тутже будет закрыватся...
Во вторых вот код:
Код

#pragma comment(linker,"/MERGE:.rdata=.text")
#pragma comment(linker,"/FILEALING:512 /SECTION:.text,EWRX /IGNORE:4028")
#pragma comment(linker,"/ENTRY:WinMain")
#include <windows.h>
ATOM MyRegisterClass(HINSTANCE hInst);
LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
BOOL                InitInstance(HINSTANCE, int);
MSG msg;
#define IDM_EXIT       105
char __title[64]="Window";
char __class[64]="Window";
WNDCLASSEX wc;
int APIENTRY WinMain(HINSTANCE hInst,HINSTANCE hPrevInst, LPTSTR lpCmdLine,int iCmdShow)
{
wc.cbSize = sizeof(WNDCLASSEX); 
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = (WNDPROC)WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInst;
wc.hIcon = NULL;
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wc.lpszMenuName = NULL;
wc.lpszClassName = __class;
wc.hIconSm = NULL;
RegisterClassEx(&wc);
CreateWindowEx(0,__class,__title,WS_VISIBLE+WS_DLGFRAME+WS_SYSMENU,128,128,256,192,NULL,NULL,wc.hInstance,NULL);
while(GetMessage(&msg,NULL,0,0))
{
    TranslateMessage(&msg);
    DispatchMessage(&msg);
}
return (int) msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    int wmId, wmEvent;
    PAINTSTRUCT ps;
    HDC hdc;

    switch (message) 
    {
    case WM_COMMAND:
        wmId    = LOWORD(wParam); 
        wmEvent = HIWORD(wParam); 
        // Parse the menu selections:
        switch (wmId)
        {
        case IDM_EXIT:
            DestroyWindow(hWnd);
            break;
        default:
            return DefWindowProc(hWnd, message, wParam, lParam);
        }
        break;
    case WM_PAINT:
        hdc = BeginPaint(hWnd, &ps);
        // TODO: Add any drawing code here...
        EndPaint(hWnd, &ps);
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}


Добавлено @ 13:50 
Компиль в Win32 -> Empty -> release !
.EXE получается размером 10 кило !!!
Могу попытатся уменьшить код.

Добавлено @ 14:01 
Ну уж проше некуда!!!
Урезал что смог вот результат:
Код

#pragma comment(linker,"/MERGE:.rdata=.text")
#pragma comment(linker,"/FILEALING:512 /SECTION:.text,EWRX /IGNORE:4028")
#pragma comment(linker,"/ENTRY:WinMain")
#include <windows.h>
LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
//---------------------------
WNDCLASSEX wc;
#define IDM_EXIT       105
//----------------------------
int APIENTRY WinMain(HINSTANCE hInst,HINSTANCE hPrevInst, LPTSTR lpCmdLine,int iCmdShow)
{
MSG msg;
TCHAR __class[64]="Window";
wc.cbSize = sizeof(WNDCLASSEX);
wc.lpfnWndProc = (WNDPROC)WndProc;
wc.hInstance = hInst;
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wc.lpszClassName = __class;

RegisterClassEx(&wc);
CreateWindowEx(0,__class,__class,WS_VISIBLE+WS_DLGFRAME+WS_SYSMENU,128,128,256,192,NULL,NULL,wc.hInstance,NULL);
while(GetMessage(&msg,NULL,0,0))
{
    TranslateMessage(&msg);
    DispatchMessage(&msg);
}
return (int) msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    int wmId, wmEvent;
    PAINTSTRUCT ps;
    HDC hdc;
    switch (message) 
    {
    case WM_COMMAND:
        wmId    = LOWORD(wParam); 
        wmEvent = HIWORD(wParam); 
        break;
    case WM_PAINT:
        hdc = BeginPaint(hWnd, &ps);
        EndPaint(hWnd, &ps);
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}

Автор: jonie 9.3.2007, 15:27
проще чем сделать окно из диалога метода не знаю (на winAPI) 8)
может вполне хватит?) 
Код

int CALLBACK WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{
    hInst = hInstance;
    DialogBox(hInst,MAKEINTRESOURCE(IDD_DIALOG),0,(DLGPROC)DialogProc); //ессно дилог должен быть описан в ресурсах //
}


INT_PTR CALLBACK DialogProc(HWND hwndDlg,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
    switch (uMsg)
    {
.........................
    default:
        return FALSE;//not process message
    }
    return TRUE;//process message
}

Автор: drZmeu 9.3.2007, 15:41
Для графики я думаю неподойдёт!!!
Хотя кто знает с графикой неработал.

Автор: jonie 10.3.2007, 00:05
Цитата

Для графики я думаю неподойдёт!!!
Хотя кто знает с графикой неработал.
крута.. и в чем отличия от "просто окон" ?) smile 

Автор: drZmeu 10.3.2007, 00:22
Ну вобше если подумать вомногом !!!
Пускай автор топа решает какой метод ему подходит больше.

Автор: jonie 10.3.2007, 00:40
Цитата

Ну вобше если подумать вомногом !!!
ну так и в чем же?

Автор: GremlinProg 10.3.2007, 10:51
Различия в работе самой процедуры окна(результат передается в DWL_MSGRESULT) и в создании контролов диалага(в DialogBox они создаются автоматически). Графика тут, конечно, ни при чем. Вопрос скорости разработки: самый быстрый и простой способ вывести информацию в окне - это DialogBox, но если используется модель взаимодействия контролов на уровне оконных классов, то CreateWindow/Ex позволит гибче управлять этим взаимодействием, потому что обработка всех ключевых событий окна ложится на плечи девелопера.

Желание Sergio очевидно:
Цитата(Sergio @  8.3.2007,  01:15 Найти цитируемый пост)
Хочу создать простое окно для будущего вывода графики в нём


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