LoadImage не заружает стандартный значек

Тема в разделе "WASM.BEGINNERS", создана пользователем Rockphorr, 2 авг 2022.

  1. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.615
    Адрес:
    Russia
    Вот фрагмент обработчика wm_paint - загружаю иконку LoadIcon - все гуд, пробую загрузить через LoadImage - не грузит
    Весь сыр-бор из-за того что LoadImage согласно книжкам может большие иконки загружать, а в с плюс плюсе там у них макрос MAKEINTRESOURCE для этого дела
    В атаче полный исходник.
    Код (ASM):
    1. ;---------------------------
    2.     mov    EAX,IDI_APPLICATION
    3.     push    EAX
    4.     xor    EAX,EAX
    5.     push    EAX
    6.     call    LoadIcon
    7.     ;---------------------------
    8.     push    EAX
    9.     mov    EAX,10;Y
    10.     push    EAX
    11.     mov    EAX,1;X
    12.     push    EAX
    13.     push    [EBP+@HDC]
    14.     call    DrawIcon ; <--- here works fine !!!
    15.     ;---------------------------
    16.     mov    EAX,0
    17.     push    EAX    ;fuLoad
    18.     mov    EAX,10h ;y height
    19.     push    EAX    ;cyDesired
    20.     mov    EAX,10h ;x width
    21.     push    EAX    ;cxDesired
    22.     mov    EAX,IMAGE_ICON
    23.     push    EAX    ;uType
    24.     mov    EAX,OIC_WINLOGO
    25.     push    EAX    ;lpszName
    26.     xor    EAX,EAX
    27.     push    EAX    ;hinst
    28.     call    LoadImage  ; <------ here returns NULL --- WHY ?
    29.     ;---------------------------
    30.     push    EAX
    31.     mov    EAX,200;Y
    32.     push    EAX
    33.     mov    EAX,1;X
    34.     push    EAX
    35.     push    [EBP+@HDC]
    36.     call    DrawIcon ; <---- then here is nothing too
    [​IMG]
     

    Вложения:

    • tute04.zip
      Размер файла:
      1,5 КБ
      Просмотров:
      93
    Последнее редактирование модератором: 2 авг 2022
  2. TrashGen

    TrashGen ТрещГен

    Публикаций:
    0
    Регистрация:
    15 мар 2011
    Сообщения:
    1.173
    Адрес:
    подполье
    Rockphorr, тралль в дзене? пока у меня нет вопроса на ваш ответ, но он обзязательно не будет не найден! а, сталобыть здраствуйти, с возвращением в Нас!
     
  3. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.708
    [​IMG]
    00.jpg
    paint.asm
    Код (ASM):
    1. .386
    2. .model flat,stdcall
    3. option casemap:none
    4. IDC_ICON1 = 500
    5. IDC_ICON2 = 501
    6. WinMain proto :DWORD,:DWORD,:DWORD,:DWORD
    7. include \masm32\include\windows.inc
    8. include \masm32\include\user32.inc
    9. include \masm32\include\kernel32.inc
    10. includelib \masm32\lib\user32.lib
    11. includelib \masm32\lib\kernel32.lib
    12. .data
    13. ClassName db "SimpleWinClass",0
    14. AppName  db "Our First Window",0
    15. OurText  db "Win32 assembly is great and easy!",0
    16. .code
    17. WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD
    18. LOCAL wc:WNDCLASSEX
    19. LOCAL msg:MSG
    20.            mov   wc.cbSize,SIZEOF WNDCLASSEX
    21.            mov   wc.style, CS_HREDRAW or CS_VREDRAW
    22.            mov   wc.lpfnWndProc, OFFSET WndProc
    23.            mov   wc.cbClsExtra,NULL
    24.            mov   wc.cbWndExtra,NULL
    25.            mov   wc.hInstance,400000h
    26.            mov   wc.hbrBackground,COLOR_WINDOW+1
    27.            mov   wc.lpszMenuName,NULL
    28.            mov   wc.lpszClassName,OFFSET ClassName
    29.            invoke LoadIcon,400000h,IDC_ICON1
    30.            mov   wc.hIcon,eax
    31.            mov   wc.hIconSm,eax
    32.            invoke LoadCursor,NULL,IDC_ARROW
    33.            mov   wc.hCursor,eax
    34.            invoke RegisterClassEx, addr wc
    35.           INVOKE CreateWindowEx,NULL,addr ClassName,ADDR AppName, WS_OVERLAPPEDWINDOW or WS_VISIBLE,\
    36.       CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL,400000h,NULL
    37. .WHILE TRUE
    38.                 INVOKE GetMessage, ADDR msg,NULL,0,0            
    39.                 INVOKE TranslateMessage, ADDR msg
    40.                 INVOKE DispatchMessage, ADDR msg
    41. .ENDW
    42. WinMain endp
    43. WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
    44. LOCAL hdc:HDC
    45. LOCAL ps:PAINTSTRUCT
    46. LOCAL rect:RECT
    47. .IF uMsg==WM_DESTROY
    48.            invoke ExitProcess,0
    49. .ELSEIF uMsg==WM_PAINT
    50.            invoke BeginPaint,hWnd, ADDR ps
    51.            mov    hdc,eax
    52.            invoke GetClientRect,hWnd, ADDR rect
    53.          invoke DrawText,hdc,ADDR OurText,-1, ADDR rect, DT_SINGLELINE or DT_CENTER or DT_VCENTER
    54. ;---------------------------
    55.            invoke LoadIcon,400000h,IDC_ICON1
    56. ;---------------------------
    57.          invoke DrawIcon,hdc,1,10,eax
    58. ;---------------------------
    59.          invoke LoadImage,400000h,IDC_ICON2,IMAGE_ICON,256,256,LR_DEFAULTCOLOR
    60. ;---------------------------
    61.            invoke DrawIcon,hdc,1,100,eax
    62. ;---------------------------
    63.            invoke EndPaint,hWnd, ADDR ps
    64.            leave
    65.            mov    eax,TRUE
    66.            ret
    67. .ELSE
    68.             leave
    69.            jmp DefWindowProc
    70. .ENDIF
    71. WndProc endp
    72. end WinMain
    rsrc.rc
    Код (C):
    1. #include "\masm32\include\resource.h"
    2. #define IDC_ICON1 500
    3. #define IDC_ICON2 501
    4. IDC_ICON1 ICON "icon1.ico"
    5. IDC_ICON2 ICON "icon2.ico"
     

    Вложения:

    • Rockphorr.zip
      Размер файла:
      475,3 КБ
      Просмотров:
      99
  4. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.615
    Адрес:
    Russia

    это все здорово, но тривиально, мне было интересно почему стандартные общедоступные значки типа IDI_APPLICATION и IDI_прочая_херня цепляются loadicon но не цепляются loadimage
     
  5. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.708
    Если тривиально, тогда почему у вас не получилось? И обязательно системные иконки, а из ресурсов ни-ни?
    Rockphorr, сравните
    у вас
    Код (ASM):
    1.              mov EAX,LR_SHARED
    2.              push EAX ;fuLoad
    3.              mov EAX,0h ;<-----y height
    4.              push EAX ;cyDesired
    5.              mov EAX,0h ;<-----x width
    6.              push EAX ;cxDesired
    7.              mov EAX,IMAGE_ICON
    8.              push EAX ;uType
    9.              ;xor EAX,EAX
    10.              mov EAX,OIC_WINLOGO
    11.              push EAX ;lpszName
    12.              xor EAX,EAX
    13.              mov EAX,hInstance
    14.              push EAX ;hinst
    15.              call LoadImage
    у меня
    Код (ASM):
    1. invoke LoadImage,400000h,IDC_ICON2,IMAGE_ICON,256,256,LR_DEFAULTCOLOR
    где 256 это реальная высота и ширина иконки, у вас эти размеры нулевые
    00.jpg
    то же самое, но с системными-стандартными-общедоступными иконками
    Код (ASM):
    1. invoke LoadIcon,0,IDI_APPLICATION
    2. invoke DrawIcon,hdc,1,10,eax
    3. invoke LoadImage,0,OIC_WINLOGO,IMAGE_ICON,32,32,LR_SHARED
    4. invoke DrawIcon,hdc,1,100,eax
    Всё работает
     

    Вложения:

    • Rockphorr.zip
      Размер файла:
      2,1 КБ
      Просмотров:
      95
    Rockphorr нравится это.
  6. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.615
    Адрес:
    Russia

    Вот здесь ВАМ Mikl___, большая благодарность, это чистая победа.
    Но я также понял где я накосячил - добавив getlasterror я позабыл окружить его push hicon/ pop hicon что приводило к потере хендла :)
    вот работающий код
    Код (ASM):
    1.    mov   EAX,LR_SHARED
    2.    push   EAX   ;fuLoad
    3.    mov   EAX,32 ;y height
    4.    push   EAX   ;cyDesired
    5.    mov   EAX,32 ;x width
    6.    push   EAX   ;cxDesired
    7.    mov   EAX,IMAGE_ICON
    8.    push   EAX   ;uType
    9.    ;xor   EAX,EAX
    10.    mov   EAX,OIC_WINLOGO
    11.    push   EAX   ;lpszName
    12.    xor   EAX,EAX
    13.    ;mov   EAX,hInstance
    14.    push   EAX   ;hinst
    15.    call   LoadImage
    16.    ;---------------------------
    17.    push   EAX
    18.    mov   EAX,100;Y
    19.    push   EAX
    20.    mov   EAX,1;X
    21.    push   EAX
    22.    push   [EBP+@HDC]
    23.    call   DrawIcon
     
    Последнее редактирование модератором: 3 авг 2022