Великий и ужасный Борланд + WinMain
От: shvellerr Россия  
Дата: 10.01.09 22:02
Оценка: :))
Эта проблемка тут описывалась. В двух словах взял книгу В.Лаптева Экспрес курс там есть пример оконного приложения на WinAPI стр 425 (у кого есть книга могут посмотреть) набрал с чистого листа без проекта. Откомпилировалась. при запуске выдала — Unresolved external '_main' referenced from C:\BC5\LIB\C0X32.OBJ. смотрел статью — "Анатомия C Run-Time, или Как сделать программу немного меньшего размера
" Уже разобрался что нужно изменить точку входа на WinMain() да вот только как это сделать в Borland'e я ни могу понять (Борланд с+ 5.02)
да еще этот код скопированый в "проект" заработал без проблем но очень хочется "вручную". Просьба Визуал не предлагать нарисовать окно мышкой не интересно...
кидаю на всякий случай код мало ли еще ошибка гдето внутри...

з.ы. поиск в интернете ничего вразумительного не дал. а в книге не описано искал где мог хелп!

              // Даеж окна!
              // листинг 13.3 стр 426
#include <windows.h>

LRESULT CALLBACK WndProc (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
BOOL RegClass (HINSTANCE hInst, WNDPROC WndProc, LPCTSTR szName);

//=====================================================================
int WINAPI WinMain (    HINSTANCE hI,         //    Хендля текусчая
                            HINSTANCE hP,         //    Хендля предыдущая
                            LPSTR lpszCmdLine, //   параметры командной страки
                            int nCmdLine)        //    вид на икране

 {
 MSG msg;            //  саабщение (читай смска)
 HWND hwnd;            //  "хендл-шмендл" окна
 static char szClassName[]="FirstProgramm";     //
 // Регистрация класса окна
 if (!RegClass (hI, WndProc, szClassName)) return FALSE;  // ФАЛСИ!!!
 // создание ГЛАВНАГО АКНА
 hwnd = CreateWindow (
          szClassName,                            //  имя класс окна
          "ТАБЛИЦА УМНОЖЕНИЯ",                    //  заголовок окна
          WS_OVERLAPPEDWINDOW|WS_VISIBLE,         // стиль окна
          CW_USEDEFAULT, CW_USEDEFAULT,        // координаты окна
          CW_USEDEFAULT, CW_USEDEFAULT,            // Размеры окна
          0,         //  сирота (Родителя нет)
          0,            //  меню нет
          hI,        //  наш Хендл
          NULL);     //  Дополнительно
 if (!hwnd) return FALSE;     //   если не создалось - ВЫХОДИМ
 ShowWindow (hwnd, SW_SHOWNORMAL); //  показать окно
 UpdateWindow (hwnd);    //  перерисовать окно
 while (GetMessage (&msg, 0, 0, 0))    // цикл обработки сообщений
    {
    TranslateMessage (&msg);
    DispatchMessage (&msg);
    }
 return msg.wParam;
} //   конец главноай функций
// ===========================================================

BOOL RegClass (HINSTANCE hInst, WNDPROC WndProc, LPCTSTR szName)
  {
  WNDCLASS wc; //
  wc.style=CS_HREDRAW | CS_VREDRAW; //  стиль окна
  wc.lpfnWndProc=WndProc;                //  А. Функция окна
  wc.lpszMenuName=NULL;                    //  Б. меню нет!
  wc.lpszClassName=szName;                //  фиксируем класс окна
  wc.hInstance=hInst;                    //  "хендл приложения"
// ЗАГРУЗКА РЕСУРСЕЙ
  wc.hIcon=LoadIcon (NULL, IDI_APPLICATION);
  wc.hCursor=LoadCursor (NULL, IDC_ARROW);
  //
  wc.hbrBackground = (HBRUSH)GetStockObject (LTGRAY_BRUSH); //класс окна
  wc.cbClsExtra = wc.cbWndExtra =0;
  return (RegisterClass (&wc)!=0);    //  РЕГИСТРАЦИЯ
}
// ============================================================

LRESULT CALLBACK WndProc (
        HWND hwnd,     // "хендл" окна
        UINT msg,    //  идентификатор сообщения
        WPARAM wParam, // дополнительный параметр
        LPARAM lParam)    //  дополнительный параметр
    {
    switch (msg)
        {
        case WM_CREATE:            // Создается окно
          MessageBox (hwnd, "Сообщение WM_CREATE",    //   заголовок
          "Начало!",                                            // сообщение
          MB_OK|MB_ICONWARNING);                            // значек (!)
          return 0;
        case WM_LBUTTONDOWN:        // нажата левая княпка мыхи
          MessageBox (hwnd, "Сообщение WM_LBUTTONDOWN ", "Выполняем!",
          MB_OK|MB_ICONINFORMATION);    // значек (i)
          return 0;
        case WM_DESTROY:  // уничтожаем окно
          MessageBox (hwnd, "Сообщение WM_DESTROY", "ЭТО Конец!",
          MB_OK|MB_ICONQUESTION);    // значек (?)
          PostQuitMessage (0);     //  послали WM_QUIT
          return 0;
        }
        //другие сообщения не обрабатуем! ё!
    return DefWindowProc(hwnd, msg, wParam, lParam);
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.