Вот фрагмент обработчика wm_paint - загружаю иконку LoadIcon - все гуд, пробую загрузить через LoadImage - не грузит Весь сыр-бор из-за того что LoadImage согласно книжкам может большие иконки загружать, а в с плюс плюсе там у них макрос MAKEINTRESOURCE для этого дела В атаче полный исходник. Код (ASM): ;--------------------------- mov EAX,IDI_APPLICATION push EAX xor EAX,EAX push EAX call LoadIcon ;--------------------------- push EAX mov EAX,10;Y push EAX mov EAX,1;X push EAX push [EBP+@HDC] call DrawIcon ; <--- here works fine !!! ;--------------------------- mov EAX,0 push EAX ;fuLoad mov EAX,10h ;y height push EAX ;cyDesired mov EAX,10h ;x width push EAX ;cxDesired mov EAX,IMAGE_ICON push EAX ;uType mov EAX,OIC_WINLOGO push EAX ;lpszName xor EAX,EAX push EAX ;hinst call LoadImage ; <------ here returns NULL --- WHY ? ;--------------------------- push EAX mov EAX,200;Y push EAX mov EAX,1;X push EAX push [EBP+@HDC] call DrawIcon ; <---- then here is nothing too
Rockphorr, тралль в дзене? пока у меня нет вопроса на ваш ответ, но он обзязательно не будет не найден! а, сталобыть здраствуйти, с возвращением в Нас!
paint.asm Код (ASM): .386 .model flat,stdcall option casemap:none IDC_ICON1 = 500 IDC_ICON2 = 501 WinMain proto :DWORD,:DWORD,:DWORD,:DWORD include \masm32\include\windows.inc include \masm32\include\user32.inc include \masm32\include\kernel32.inc includelib \masm32\lib\user32.lib includelib \masm32\lib\kernel32.lib .data ClassName db "SimpleWinClass",0 AppName db "Our First Window",0 OurText db "Win32 assembly is great and easy!",0 .code WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD LOCAL wc:WNDCLASSEX LOCAL msg:MSG mov wc.cbSize,SIZEOF WNDCLASSEX mov wc.style, CS_HREDRAW or CS_VREDRAW mov wc.lpfnWndProc, OFFSET WndProc mov wc.cbClsExtra,NULL mov wc.cbWndExtra,NULL mov wc.hInstance,400000h mov wc.hbrBackground,COLOR_WINDOW+1 mov wc.lpszMenuName,NULL mov wc.lpszClassName,OFFSET ClassName invoke LoadIcon,400000h,IDC_ICON1 mov wc.hIcon,eax mov wc.hIconSm,eax invoke LoadCursor,NULL,IDC_ARROW mov wc.hCursor,eax invoke RegisterClassEx, addr wc INVOKE CreateWindowEx,NULL,addr ClassName,ADDR AppName, WS_OVERLAPPEDWINDOW or WS_VISIBLE,\ CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL,400000h,NULL .WHILE TRUE INVOKE GetMessage, ADDR msg,NULL,0,0 INVOKE TranslateMessage, ADDR msg INVOKE DispatchMessage, ADDR msg .ENDW WinMain endp WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM LOCAL hdc:HDC LOCAL ps:PAINTSTRUCT LOCAL rect:RECT .IF uMsg==WM_DESTROY invoke ExitProcess,0 .ELSEIF uMsg==WM_PAINT invoke BeginPaint,hWnd, ADDR ps mov hdc,eax invoke GetClientRect,hWnd, ADDR rect invoke DrawText,hdc,ADDR OurText,-1, ADDR rect, DT_SINGLELINE or DT_CENTER or DT_VCENTER ;--------------------------- invoke LoadIcon,400000h,IDC_ICON1 ;--------------------------- invoke DrawIcon,hdc,1,10,eax ;--------------------------- invoke LoadImage,400000h,IDC_ICON2,IMAGE_ICON,256,256,LR_DEFAULTCOLOR ;--------------------------- invoke DrawIcon,hdc,1,100,eax ;--------------------------- invoke EndPaint,hWnd, ADDR ps leave mov eax,TRUE ret .ELSE leave jmp DefWindowProc .ENDIF WndProc endp end WinMain rsrc.rc Код (C): #include "\masm32\include\resource.h" #define IDC_ICON1 500 #define IDC_ICON2 501 IDC_ICON1 ICON "icon1.ico" IDC_ICON2 ICON "icon2.ico"
это все здорово, но тривиально, мне было интересно почему стандартные общедоступные значки типа IDI_APPLICATION и IDI_прочая_херня цепляются loadicon но не цепляются loadimage
Если тривиально, тогда почему у вас не получилось? И обязательно системные иконки, а из ресурсов ни-ни? Rockphorr, сравните у вас Код (ASM): mov EAX,LR_SHARED push EAX ;fuLoad mov EAX,0h ;<-----y height push EAX ;cyDesired mov EAX,0h ;<-----x width push EAX ;cxDesired mov EAX,IMAGE_ICON push EAX ;uType ;xor EAX,EAX mov EAX,OIC_WINLOGO push EAX ;lpszName xor EAX,EAX mov EAX,hInstance push EAX ;hinst call LoadImage у меня Код (ASM): invoke LoadImage,400000h,IDC_ICON2,IMAGE_ICON,256,256,LR_DEFAULTCOLOR где 256 это реальная высота и ширина иконки, у вас эти размеры нулевые то же самое, но с системными-стандартными-общедоступными иконками Код (ASM): invoke LoadIcon,0,IDI_APPLICATION invoke DrawIcon,hdc,1,10,eax invoke LoadImage,0,OIC_WINLOGO,IMAGE_ICON,32,32,LR_SHARED invoke DrawIcon,hdc,1,100,eax Всё работает
Вот здесь ВАМ Mikl___, большая благодарность, это чистая победа. Но я также понял где я накосячил - добавив getlasterror я позабыл окружить его push hicon/ pop hicon что приводило к потере хендла вот работающий код Код (ASM): mov EAX,LR_SHARED push EAX ;fuLoad mov EAX,32 ;y height push EAX ;cyDesired mov EAX,32 ;x width push EAX ;cxDesired mov EAX,IMAGE_ICON push EAX ;uType ;xor EAX,EAX mov EAX,OIC_WINLOGO push EAX ;lpszName xor EAX,EAX ;mov EAX,hInstance push EAX ;hinst call LoadImage ;--------------------------- push EAX mov EAX,100;Y push EAX mov EAX,1;X push EAX push [EBP+@HDC] call DrawIcon