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


Автор: HellanD 5.9.2006, 20:22
Подскажите плиз что в коде не так!
Я создал картинку (.bmp), в студийном редакторе ресурсов и хочу сделать так чтоб она вызывалась иконкой но ничего не происходит - вот взгляните!
Код

int WINAPI WinMain(HINSTANCE hPervInst,HINSTANCE hPredidInst,
                   PSTR czCmdLine,int iCmdShow)
{
HWND hwnd;
MSG msg;
WNDCLASSEX wndclass;
wndclass.cbClsExtra=0;
wndclass.cbSize=sizeof(wndclass);
wndclass.cbWndExtra=0;
wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
wndclass.hCursor=LoadCursor(NULL,IDI_APPLICATION);
//---------------------------------------------------
wndclass.hIcon=LoadIcon(0,"we.bmp");
wndclass.hIconSm=LoadIcon(0,"we.bmp");
//---------------------------------------------------
wndclass.hInstance=hPervInst;
wndclass.lpszMenuName=NULL;
wndclass.lpfnWndProc=WndProc;
wndclass.lpszClassName="Priv";
wndclass.style=CS_HREDRAW|CS_VREDRAW;
RegisterClassEx(&wndclass);


название we.bmp!
Спасибо

Автор: Snowy 5.9.2006, 21:12
Как интересно.
А что, уже появились иконки с расширением bmp?
И вообще правильно. Зачем передавть в LoadIcon hInstance? Ноль и всё...
Пусть винда сама гадает, что от неё хотели...

Добавлено @ 21:14 
ЗЫ. Зачем ресурсу расширение?
Расширение должно быть у файла. Сомневаюсь, что стандартный редактор ресурсов вздумает пришлёпывать расширение ресурсу...

Автор: HellanD 5.9.2006, 21:16
Да это был крик души ну вот есть несколько вариантов:
Код

int WINAPI WinMain(HINSTANCE hPervInst,HINSTANCE hPredidInst,
                   PSTR czCmdLine,int iCmdShow)
{
HWND hwnd;
MSG msg;
WNDCLASSEX wndclass;
wndclass.cbClsExtra=0;
wndclass.cbSize=sizeof(wndclass);
wndclass.cbWndExtra=0;
wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
wndclass.hCursor=LoadCursor(NULL,IDI_APPLICATION);
wndclass.hIcon=LoadIcon(hPervInst,IDI_ICON1);
wndclass.hIconSm=LoadIcon(hPervInst,IDI_ICON1);

Он пишет что не знает вааще IDI_ICON1 хотя я его создал....
Не будьте так строги я не волшебник я только УЧУСЬ!!!!!

Автор: bugmenot 5.9.2006, 21:18
HellanD

Код
#include "resource.h"

Ставил?

Автор: HellanD 5.9.2006, 21:21
Я не ставил....
Щас попробовал посмотри плиз мне компилятор провел

Compiling...
StartButton.cpp
c:\documents and settings\oleg\мои документы\visual studio 2005\projects\startbutton\startbutton\startbutton.cpp(16) : error C2664: 'LoadIconA' : cannot convert parameter 2 from 'int' to 'LPCSTR'
        Conversion from integral type to pointer type requires reinterpret_cast, C-style cast or function-style cast
c:\documents and settings\oleg\мои документы\visual studio 2005\projects\startbutton\startbutton\startbutton.cpp(17) : error C2664: 'LoadIconA' : cannot convert parameter 2 from 'int' to 'LPCSTR'
        Conversion from integral type to pointer type requires reinterpret_cast, C-style cast or function-style cast
c:\documents and settings\oleg\мои документы\visual studio 2005\projects\startbutton\startbutton\startbutton.cpp(36) : warning C4244: 'return' : conversion from 'WPARAM' to 'int', possible loss of data
Build log was saved at "file://c:\Documents and Settings\Oleg\Мои документы\Visual Studio 2005\Projects\StartButton\StartButton\Debug\BuildLog.htm"
StartButton - 2 error(s), 1 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

Добавлено @ 21:24 
Вот полный код...
Код

# include <windows.h>
#include "resource.h"
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);

int WINAPI WinMain(HINSTANCE hPervInst,HINSTANCE hPredidInst,
                   PSTR czCmdLine,int iCmdShow)
{
HWND hwnd;
MSG msg;
WNDCLASSEX wndclass;
wndclass.cbClsExtra=0;
wndclass.cbSize=sizeof(wndclass);
wndclass.cbWndExtra=0;
wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
wndclass.hCursor=LoadCursor(NULL,IDI_APPLICATION);
wndclass.hIcon=LoadIcon(hPervInst,IDI_ICON1);
wndclass.hIconSm=LoadIcon(hPervInst,IDI_ICON1);
wndclass.hInstance=hPervInst;
wndclass.lpszMenuName=NULL;
wndclass.lpfnWndProc=WndProc;
wndclass.lpszClassName="Priv";
wndclass.style=CS_HREDRAW|CS_VREDRAW;
RegisterClassEx(&wndclass);

hwnd=CreateWindow("Priv","HI",WS_OVERLAPPEDWINDOW,
                  CW_USEDEFAULT,CW_USEDEFAULT,
                  CW_USEDEFAULT,CW_USEDEFAULT,
                  NULL,NULL,hPervInst,NULL);

ShowWindow(hwnd,iCmdShow);
UpdateWindow(hwnd);
while(GetMessage(&msg,NULL,0,0)){
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}


LRESULT CALLBACK WndProc(HWND hwnd,UINT iMsg,WPARAM wParam,LPARAM lParam){
static int Lengh,Width,i=2;
HWND hwndC;
HDC hdc;
PAINTSTRUCT ps;
HBRUSH hBr;
switch(iMsg){
    case WM_CREATE:
        return 0;
    case WM_SIZE:
        Lengh=HIWORD(lParam);
        Width=LOWORD(lParam);
        return 0;
    case WM_PAINT:
        hdc=BeginPaint(hwnd,&ps);
        
        EndPaint(hwnd,&ps);
        return 0;
    case WM_DESTROY:
        PostQuitMessage(0);
        
        return 0;
}
return DefWindowProc(hwnd,iMsg,wParam,lParam);
}


И ресур название имеет icon1.ico а в части ресурсов IDI_ICON1

Автор: bugmenot 5.9.2006, 21:25
Поменяй
Код
wndclass.hIcon=LoadIcon(hPervInst,IDI_ICON1);
wndclass.hIconSm=LoadIcon(hPervInst,IDI_ICON1);

C
Код
wndclass.hIcon=LoadIcon(hPervInst, MAKEINTRESOURCE(IDI_ICON1));
wndclass.hIconSm=LoadIcon(hPervInst, MAKEINTRESOURCE(IDI_ICON1));

Или
Код
wndclass.hIcon=LoadIcon(hPervInst, (LPCSTR)IDI_ICON1);
wndclass.hIconSm=LoadIcon(hPervInst, (LPCSTR)IDI_ICON1);

Автор: Snowy 5.9.2006, 21:26
Код

wndclass.hIcon = LoadIcon(GetModuleHandle(NULL), "MYICON");

При этом иконка должна иметь формат ico. В процедуру нужно передать имя ресурса. В примере его зовут "MYICON".
GetModuleHandle можно заменить на hInstance своей программы или файла с ресурсом, если он известен.

Добавлено @ 21:28 
Если возвращает ощибку, то прочитай GetLastError - там сказано, почему не грузицца.

Автор: HellanD 5.9.2006, 21:32
Спасибо код работает!
Скажите а что за промежуточная функция такая MAKEINTRESOURCE(IDI_ICON1)

И еще 
Код

wndclass.hIcon = LoadIcon(GetModuleHandle(NULL), "MYICON");

Это значит что если у меня иконка в файле icon1.ico я могу написать
wndclass.hIcon = LoadIcon(GetModuleHandle(NULL), "icon1");
Но так не работает!!!!!!!!

Автор: bugmenot 5.9.2006, 21:36
Цитата(HellanD @  5.9.2006,  21:32 Найти цитируемый пост)
что за промежуточная функция

Это макро

Обозначено как:
Код
#define MAKEINTRESOURCE(i)  (LPTSTR) ((DWORD) ((WORD) (i)))


Цитата(HellanD @  5.9.2006,  21:32 Найти цитируемый пост)
Это значит что если у меня иконка в файле icon1.ico я могу написать

Нет =)

Автор: Snowy 5.9.2006, 21:38
MAKEINTRESOURCE - указывает тип ресурса, который ты собираешься грузить.
Также необходимо знать язык ресурса и его имя, чтобы загрузить.
Знание имени файла совершенно недостаточно.
Если ты создавал ресурсы, то все эти параметры нужно знать.
Язык лучше устанавливать на нейтральный - 0. Тип иконка. Имя - зависит только от тебя.

Цитата(HellanD @  5.9.2006,  21:32 Найти цитируемый пост)
wndclass.hIcon = LoadIcon(GetModuleHandle(NULL), "icon1");
А не факт, что она именно так называется.
Как назвал, так и грузи...
ЗЫ. Ресурсы именуются заглавными буквами.

Автор: HellanD 5.9.2006, 21:43
Еще раз вам спасибо!!!

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