StatusBar в VC++

Форум для программистов

Сообщение Bio Wolf » Вс авг 01, 2004 5:06 pm

Учу VC++ уже 3 день, разобрался с окнами. меню иконками - но вот со статус баром не получается.
Если что не пинайте сильно - по книгам все работает, а в реальности нет Изображение Изображение Изображение

Код: выделить все
// Исключаем редко-используемый материал из заголовков Windows
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <tchar.h>
#include <commctrl.h>

#include "resource.h"

#define MAX_LOADSTRING 100

// Глобальные переменные
HINSTANCE hInst;
TCHAR szTitle[MAX_LOADSTRING];   // заголовок окна
TCHAR szWindowClass[MAX_LOADSTRING]; // класс главного окна

// Предописания функций, включенных в этот модуль кода:
ATOM    MyRegisterClass(HINSTANCE hInstance);
BOOL    InitInstance(HINSTANCE, int);
LRESULT CALLBACK   WndProc(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK   About(HWND, UINT, WPARAM, LPARAM);

int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
       LPTSTR lpCmdLine, int nCmdShow) {
   MSG msg;
   HACCEL hAccelTable;

   // инициализация глобальных строк
   LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING); // заголовок
   LoadString(hInstance, IDS_WINCLASS, szWindowClass, MAX_LOADSTRING); // класс
   MyRegisterClass(hInstance);

   // выполнение инициализации приложения
   if (!InitInstance(hInstance, nCmdShow)) return FALSE;

   // загрузка акселераторов
   hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDR_ACCELERATOR1);

   // главный цикл сообщений
   while (GetMessage(&msg, NULL, 0, 0)) {
 if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
 }
   }

   return (int)msg.wParam;
}

// ФУНКЦИЯ: MyRegisterClass()
// ЦЕЛЬ: Регистрирует класс окна.
// КОММЕНТАРИИ:
// Эта функция и ее использование необходимо, если Вы хотите, чтобы этот код
// был совместимым с Win32 системами предшествующими функции "RegisterClassEx",
// которая была добавлена в Windows 95. Важно вызвать эту функцию так, чтобы
// приложение получило маленькие значки.

ATOM MyRegisterClass(HINSTANCE hInstance) {
   WNDCLASSEX w;

   w.cbSize = sizeof(WNDCLASSEX);

   w.style     = CS_HREDRAW | CS_VREDRAW;
   w.lpfnWndProc   = (WNDPROC)WndProc;
   w.cbClsExtra   = 0;
   w.cbWndExtra   = 0;
   w.hInstance  = hInstance;
   w.hIcon     = LoadIcon(hInstance, (LPCTSTR)IDI_ICON1);
   w.hCursor  = LoadCursor(NULL, IDC_ARROW);
   w.hbrBackground   = (HBRUSH)(COLOR_WINDOW+1);
   w.lpszMenuName   = (LPCTSTR)IDR_MENU1;
   w.lpszClassName   = szWindowClass;
   w.hIconSm  = LoadIcon(w.hInstance, (LPCTSTR)IDI_ICON1);

   return RegisterClassEx(&w);
}

// ФУНКЦИЯ: InitInstance(HANDLE, int)
// ЦЕЛЬ: Сохраняет дескриптор и создает основное окно
// КОММЕНТАРИИ:
// В этой функции, мы сохраняем дескриптор в глобальной переменной,
// создаем и отображаем основное окно программы.

BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) {
   HWND hWnd;
   hInst = hInstance; // сохраняем дескриптор

   hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
       CW_USEDEFAULT, CW_USEDEFAULT, 200, 200, NULL, NULL, hInstance, NULL);
   if (!hWnd) return FALSE; // окно не созданно
   
   InitCommonControls();

   ShowWindow(hWnd, nCmdShow);
   UpdateWindow(hWnd);

   return TRUE;
}


//  ФУНКЦИЯ: WndProc(HWND, unsigned, WORD, LONG)
//  ЦЕЛЬ:  обработка сообщений для главного окна

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);
 // анализ команды меню:
 switch (wmId) {
 case IDM_HELP_ABOUT:
    DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About);
    break;
 case IDM_FILE_EXIT:
    DestroyWindow(hWnd);
    break;
 default:
    return DefWindowProc(hWnd, message, wParam, lParam);
 }
 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;
}

// Обработчик сообщений для окна about
LRESULT CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) {
   switch (message) {
   case WM_INITDIALOG:
 return TRUE;
   case WM_COMMAND:
 if (LOWORD(wParam) == IDOK) {
    EndDialog(hDlg, LOWORD(wParam));
    return TRUE;
 }
 break;
   }
   return FALSE;
}

Вот после InitCommonControls(); типа надо использовать CreateStatusWindow();
но даже после InitCommonControls(); - вот такое вот сообщение: winapi4 error LNK2019: unresolved external symbol __imp__InitCommonControls@0 referenced in function "int __cdecl InitInstance(struct HINSTANCE__ *,int)" (?InitInstance@@YAHPAUHINSTANCE__@@H@Z)
Без InitCommonControls() - все пашет, без статус бара.
Я уже не знаю чего делать Изображение, целый день бьюсьи читаю книги - , и везде есть такая функция - и везде она типа должна работать. всю найденую литературу перерыл.

PS может кто подскажет OnLine книжку (уроки, статьи) где описывается VC++.NET (7 версия), а то у меня только книги о BorlandCB под Win95 Изображение
Спам придумали боги в отместку за наши молитвы.
Bio Wolf
Майор
 
Сообщений: 397
Зарегистрирован: Пн апр 08, 2002 9:23 pm
Откуда: KG
Пункты репутации: 0

Сообщение VadiMGP » Пн авг 02, 2004 5:10 am

Скорее всего, ты не подключил comctl32.lib.
А вообще-то, и InitCommonControls и CreateStatusWindow - это устаревшие функции. Лучше пользоваться InitCommonControlsEx и CreateWindow с классом STATUSCLASSNAME.
Человеческая жизнь похожа на коробку спичек. Обращаться с ней серьезно - смешно. Обращаться несерьезно - опасно.
А. Рюноскэ
VadiMGP
Подполковник
 
Сообщений: 887
Зарегистрирован: Сб апр 26, 2003 10:32 am
Пункты репутации: 0

Сообщение Scalder » Пн авг 02, 2004 5:13 am

2Bio Wolf
Бери MFC и не парься... разница в скорости - не заметна, а по трудоёмкости - небо и земля....

p.s. Я тут как раз накидал примерчик на MFC (Меню+СтатусБар, сегодня хочу ещё ТулБар подкинуть - все делаю программно). Если нужен - пиши ЛС.
<!--coloro:green--><span style="color:green"><!--/coloro-->А что я не так сказал?<!--colorc--></span><!--/colorc-->
<!--coloro:red--><span style="color:red"><!--/coloro-->А ты как думал? Конечно это ИМХО<!--colorc--></span><!--/colorc-->

<!--coloro:red--><span style="color:red"><!--/coloro-->>В каждом системном администраторе есть что-то от Бога.<!--colorc--></span><!--/colorc-->
В каждом программисте есть что-то от Бога для Бога. :-р
<a href="http://www.erepublik.com/en/referrer/mrScalder" target="_blank">Изображение</a>
Scalder
Генерал-майор
 
Сообщений: 2587
Зарегистрирован: Пн апр 08, 2002 10:21 am
Пункты репутации: 0

Сообщение VadiMGP » Пн авг 02, 2004 6:14 am

2Scalder На MFC и делать ничего не надо. Там визард автоматически нужный код добавляет. :) Я так понял, что человек хочет с чистым API повозиться.
Человеческая жизнь похожа на коробку спичек. Обращаться с ней серьезно - смешно. Обращаться несерьезно - опасно.
А. Рюноскэ
VadiMGP
Подполковник
 
Сообщений: 887
Зарегистрирован: Сб апр 26, 2003 10:32 am
Пункты репутации: 0

Сообщение Bio Wolf » Пн авг 02, 2004 6:31 am

2VadiMGP
Как подключить comctl32.lib
и можно примерчик про InitCommonControlsEx и CreateWindow с классом STATUSCLASSNAME. - а то на InitCommonControlsEx меня послали еще дальше.
Правильно, я MFC открыл ужаснулся и закрыл, пока я хочу разобраться во всем на так сказать низком уровне, а потом уже и за MFC взяться.
2Scalder
Нужен скинь плиз Изображение на {webmaster CAT akipress DOT org}
Последний раз редактировалось Bio Wolf Пн авг 02, 2004 6:36 am, всего редактировалось 1 раз.
Спам придумали боги в отместку за наши молитвы.
Bio Wolf
Майор
 
Сообщений: 397
Зарегистрирован: Пн апр 08, 2002 9:23 pm
Откуда: KG
Пункты репутации: 0

Сообщение VadiMGP » Пн авг 02, 2004 6:52 am

2Bio Wolf Дополнительные библиотеки указываются в опциях линкера. Если у тебя DevStudio, то в меню Project->Settings, закладка Link, поле Object/Library modules. В MSDN всегда указано в каком lib находится нужная функция. Например

Код: выделить все
The CreateStatusWindow function calls the CreateWindow function to create the window. It passes the parameters to CreateWindow without modification and sets the position, width, and height parameters to default values.

Function Information

Header commctrl.h
Import library comctl32.lib
Minimum operating systems Windows NT 3.51, Windows 95

В принципе, Scalder прав. На чистом API париться придется гораздо больше. Если хочешь посмотреть как это делалось в доMFCшную эпоху, можешь посмотреть пример от MS - Chicoapp.
Человеческая жизнь похожа на коробку спичек. Обращаться с ней серьезно - смешно. Обращаться несерьезно - опасно.
А. Рюноскэ
VadiMGP
Подполковник
 
Сообщений: 887
Зарегистрирован: Сб апр 26, 2003 10:32 am
Пункты репутации: 0

Сообщение Bio Wolf » Пн авг 02, 2004 7:07 am

2VadiMGP
Большооооооооооое спасибо, вечерком буду разбираться :).
А у меня Micro$oft Studio.NET (7.0...) чет такое, целая куча языков типа. но на одном диске - наверное без зачатков MSDN - не нашел пока :(.
Спам придумали боги в отместку за наши молитвы.
Bio Wolf
Майор
 
Сообщений: 397
Зарегистрирован: Пн апр 08, 2002 9:23 pm
Откуда: KG
Пункты репутации: 0

Сообщение Scalder » Пн авг 02, 2004 7:57 am

А я его просто сюда выкину Изображение
Благо копейки весит Изображение
<!--coloro:green--><span style="color:green"><!--/coloro-->А что я не так сказал?<!--colorc--></span><!--/colorc-->
<!--coloro:red--><span style="color:red"><!--/coloro-->А ты как думал? Конечно это ИМХО<!--colorc--></span><!--/colorc-->

<!--coloro:red--><span style="color:red"><!--/coloro-->>В каждом системном администраторе есть что-то от Бога.<!--colorc--></span><!--/colorc-->
В каждом программисте есть что-то от Бога для Бога. :-р
<a href="http://www.erepublik.com/en/referrer/mrScalder" target="_blank">Изображение</a>
Scalder
Генерал-майор
 
Сообщений: 2587
Зарегистрирован: Пн апр 08, 2002 10:21 am
Пункты репутации: 0

Сообщение Bio Wolf » Пн авг 02, 2004 11:39 am

2VadiMGP
Хмм, я с работы на почту твой файлик перекинул, а его почтовый антивирус зарезал - назвал вирусом Изображение
Добавленно
Блин класс, буду файлы расскидывать по проекту и компилить - надеюсь не будет подводных камней.

Добавленно
Вот подводные камни - я сейчас повешусь.
chicoapp fatal error LNK1120: 8 unresolved externals
chicoapp error LNK2019: unresolved external symbol __imp__CreateStatusWindowA@16 referenced in function _CreateAppWindows
chicoapp error LNK2019: unresolved external symbol __imp__CreateToolbarEx@52 referenced in function _CreateTheToolbar
chicoapp error LNK2019: unresolved external symbol __imp__ImageList_Add@12 referenced in function _TV_CreateTreeView
chicoapp error LNK2019: unresolved external symbol __imp__ImageList_Create@20 referenced in function _LV_CreateListView
chicoapp error LNK2019: unresolved external symbol __imp__ImageList_Create@20 referenced in function _TV_CreateTreeView
chicoapp error LNK2019: unresolved external symbol __imp__ImageList_GetImageCount@4 referenced in function _TV_CreateTreeView
chicoapp error LNK2019: unresolved external symbol __imp__ImageList_ReplaceIcon@12 referenced in function _LV_CreateListView
chicoapp error LNK2019: unresolved external symbol __imp__InitCommonControls@0 referenced in function _CreateAppWindows
chicoapp error LNK2019: unresolved external symbol __imp__PropertySheetA@4 referenced in function _CreatePropertySheet

И это если убрать файл stuff.c из проекта, а то в нем на каждое второе слово ругается Изображение

2Scalder
После долгого объяснения VS что это его проект (версия не понравилавь - у меня 7.00) проект выдал вот это:
min_win - error LNK2005: "protected: virtual struct AFX_MSGMAP const * __thiscall CMainWnd::GetMessageMap(void)const " (?GetMessageMap@CMainWnd@@MBEPBUAFX_MSGMAP@@XZ) already defined in CMainWnd.obj
min_win - error LNK2005: "protected: virtual struct AFX_MSGMAP const * __thiscall CMainWnd::GetMessageMap(void)const " (?GetMessageMap@CMainWnd@@MBEPBUAFX_MSGMAP@@XZ) already defined in CMainWnd.obj
min_win - fatal error LNK1169: one or more multiply defined symbols found
CMainWnd.cpp(32) - warning C4311: 'type cast' : pointer truncation from 'HMENU' to 'UINT'

И не скомпилировался Изображение

2ALL[b]
[b]HELP
Последний раз редактировалось Bio Wolf Пн авг 02, 2004 12:43 pm, всего редактировалось 1 раз.
Спам придумали боги в отместку за наши молитвы.
Bio Wolf
Майор
 
Сообщений: 397
Зарегистрирован: Пн апр 08, 2002 9:23 pm
Откуда: KG
Пункты репутации: 0

Сообщение Bio Wolf » Пн авг 02, 2004 4:43 pm

2VadiMGP
Все нашел куда писать comctl32.lib (ну и запихали же) - теперь все работает.
2Scalder
А твой проект представляет из себя лакомый кусочек - но не работает. может что то надо тожу подправить???
MSDN - у меня отсутствует - чего делать не знаю. :(
Спам придумали боги в отместку за наши молитвы.
Bio Wolf
Майор
 
Сообщений: 397
Зарегистрирован: Пн апр 08, 2002 9:23 pm
Откуда: KG
Пункты репутации: 0

Сообщение Scalder » Вт авг 03, 2004 4:54 am

2Bio Wolf
Добавь опцию линкера "/FORCE"
<!--coloro:green--><span style="color:green"><!--/coloro-->А что я не так сказал?<!--colorc--></span><!--/colorc-->
<!--coloro:red--><span style="color:red"><!--/coloro-->А ты как думал? Конечно это ИМХО<!--colorc--></span><!--/colorc-->

<!--coloro:red--><span style="color:red"><!--/coloro-->>В каждом системном администраторе есть что-то от Бога.<!--colorc--></span><!--/colorc-->
В каждом программисте есть что-то от Бога для Бога. :-р
<a href="http://www.erepublik.com/en/referrer/mrScalder" target="_blank">Изображение</a>
Scalder
Генерал-майор
 
Сообщений: 2587
Зарегистрирован: Пн апр 08, 2002 10:21 am
Пункты репутации: 0


Вернуться в Программирование

Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 12

cron