2010-03-30 3 views
5

Я хочу улучшить свой код и структуру файлов в больших проектах Win32 с большим количеством окон и элементов управления. В настоящее время я имею тенденцию иметь один заголовок и один исходный файл для всей реализации окна или диалога. Это отлично подходит для небольших проектов, но теперь это дошло до того, что эти реализации начинают достигать 1000-2000 строк, что является утомительным для просмотра.Структурирование кода GUI Win32

Типичный исходный файл шахты выглядит следующим образом:

static LRESULT CALLBACK on_create(const HWND hwnd, WPARAM wp, LPARAM lp) { 
    setup_menu(hwnd); 
    setup_list(hwnd); 
    setup_context_menu(hwnd); 

    /* clip */ 

    return 0; 
} 

static LRESULT CALLBACK on_notify(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp) { 
    const NMHDR* header = (const NMHDR*)lp; 

    /* At this point I feel that the control's event handlers doesn't 
    * necessarily belong in the same source file. Perhaps I could move 
    * each control's creation code and event handlers into a separate 
    * source file? Good practice or cause of confusion? */ 

    switch (header->idFrom) { 
    case IDC_WINDOW_LIST: 
     switch (header->code) { 
     case NM_RCLICK: 
      return on_window_list_right_click(hwnd, wp, lp); 

     /* clip */ 
     } 
    } 
} 

static LRESULT CALLBACK wndmain_proc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp) { 
    switch (msg) { 
    case WM_CREATE: 
     return on_create(hwnd, wp, lp); 

    case WM_CLOSE: 
     return on_close(hwnd, wp, lp); 

    case WM_NOTIFY: 
     return on_notify(hwnd, wp, lp); 

    /* It doesn't matter much how the window proc looks as it just forwards 
    * events to the appropriate handler. */ 

    /* clip */ 

    default: 
     return DefWindowProc(hwnd, msg, wp, lp); 
    } 
} 

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

Я пытался найти хорошие примеры с открытым исходным кодом для структурирования кода Win32, но я просто становлюсь более смущенным, так как есть сотни файлов, и в каждом из этих файлов, которые кажутся связанными с графическим интерфейсом, код GUI Win32 кажется пока инкапсулированным далеко. И когда я наконец найду заявление CreateWindowEx, окно proc нигде не найдено.

Любые советы о том, как структурировать весь код, оставаясь при этом в здравом уме, будут очень признательны.

Спасибо!

Я не хочу использовать какие-либо библиотеки или фреймворки, поскольку я нахожу Win32 API интересным и ценным для обучения.

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

+0

Вы любите использовать как минимум класс C++ или просто c? –

+1

Вы достигли неизбежного вывода о том, что вам понадобится библиотека классов C++ для организации вашего кода. –

+0

luca - В настоящее время я изучаю C, и это то, что я использую для связанных проектов. Спасибо. – haste

ответ

5

Для начала я бы взглянул на message crackers в windowsx.h; они сохранят вас, написав утомительные заявления о случаях в ваших оконных процедурах, и они предлагают определенную дисциплину в именах функций.

+0

Это выглядит интересно на первый взгляд. Я прочитаю это подробно позже этим вечером. Спасибо. – haste

+0

Я просто приключился в мире win32. Спасибо за это, или он потребовал бы рефакторинг через пару месяцев. –

Смежные вопросы