Avatar billede the_fox Nybegynder
11. september 2006 - 13:29 Der er 16 kommentarer og
1 løsning

Mangler Ikon oppe i venstre hjørne af applikation

Jeg kan som sagt ikke få vist ikonet oppe i venstre hjørne af min applikation. Jeg har følgende i min .rc fil:

IDD_MAIN DIALOG DISCARDABLE  0, 0, 207, 156
STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Setup"
FONT 8, "MS Sans Serif"
BEGIN
    LTEXT          "bla.. bla..",IDC_STATIC,7,10,180,80
    PUSHBUTTON      "&Start",IDC_START,7,130,50,14
    PUSHBUTTON      "&Afslut",IDC_AFSLUT,60,130,50,14
    PUSHBUTTON      "&Mere",IDC_MERE,113,130,50,14

END
IDI_MYICON ICON "E:\\ikon.ico"

og jeg laver vinduet på følgende måde:

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
    LPSTR lpCmdLine, int nCmdShow)
{
        return DialogBox(hInstance, MAKEINTRESOURCE(IDD_MAIN), NULL, DlgProc);
}

Den vil godt vise ikonet på applikationen i stifinderen, men ikke i selve applikationens vindue, når applikationen er startet.

Hvad gør jeg galt? Og har I et forslag til en løsning?
Avatar billede javanovice Nybegynder
11. september 2006 - 13:43 #1
kan filen være for stor ? - det har jeg oplevet i Java-swing.
Avatar billede the_fox Nybegynder
11. september 2006 - 13:58 #2
Hmmm... umiddelbart så tror jeg ikke at det er der problemet er. Jeg har på fornemmelsen at man både skal initialisere det ikon som vises i stifinderen og det ikon som vises i selve programmets titellinie. Men jeg er lidt i tvivl om hvordan man gør.

Jeg har læst at man kan initialisere ikonerne når man registrere vinduet, ligesom herunder:

wc.hIcon  = LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_MYICON));
    wc.hIconSm  = (HICON)LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_MYICON), IMAGE_ICON, 16, 16, 0);

Men jeg registrerer slet ikke mit vindue på denne måde og hvis jeg forsøger at gøre det på den måde, så mister jeg skrifttypen og skriftstørrelsen på knapperne.
Avatar billede bertelbrander Novice
11. september 2006 - 20:42 #3
Prøv at sende en WM_SETICON fra din DlgProc, noget i stil med:
HICON SmallIcon = LoadIcon(hInstance, MAKEINTRESOURCE(180));
HICON LargeIcon = LoadIcon(hInstance, MAKEINTRESOURCE(181));
SendMessage(hwndDlg, WM_SETICON, ICON_SMALL, (LPARAM )SmallIcon);
SendMessage(hwndDlg, WM_SETICON, ICON_BIG, (LPARAM )LargeIcon);
Avatar billede the_fox Nybegynder
12. september 2006 - 10:51 #4
Jeg har lavet følgende:

case WM_CREATE:
                {
                    HICON SmallIcon = LoadIcon(hInstance, MAKEINTRESOURCE(201));
                    HICON LargeIcon = LoadIcon(hInstance, MAKEINTRESOURCE(201));
                    SendMessage(hwnd, WM_SETICON, ICON_SMALL, (LPARAM )SmallIcon);
                    SendMessage(hwnd, WM_SETICON, ICON_BIG, (LPARAM )LargeIcon);
                }
                break;

hvor 201 er ID'en på mit ikon, men den fejler da den mangler hInstance som bliver initialiseret i WinMain. Hvordan løser jeg lige det?
Avatar billede bertelbrander Novice
12. september 2006 - 19:51 #5
Du kan lave en global variabel og initialisere den til hInstance i din WinMain.

Eller du kan bruge GetModuleHandle() i stedet for hInstance.
Avatar billede the_fox Nybegynder
12. september 2006 - 20:23 #6
Argh... jeg er vist lige nødt til at få et eksempel på den globale variabel :( Det vil ikke rigtig lykkedes for mig.
Avatar billede bertelbrander Novice
12. september 2006 - 20:27 #7
I toppen af filen, efter #include ..., skriver du:
HINSTANCE InstanceHandle;

Så bruger du:
case WM_CREATE:
{
  HICON SmallIcon = LoadIcon(InstanceHandle, MAKEINTRESOURCE(201));
  HICON LargeIcon = LoadIcon(hInstanceHandle, MAKEINTRESOURCE(201));
  SendMessage(hwnd, WM_SETICON, ICON_SMALL, (LPARAM )SmallIcon);
  SendMessage(hwnd, WM_SETICON, ICON_BIG, (LPARAM )LargeIcon);
}
break;

Og i toppen af WinMain skriver du:

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
    LPSTR lpCmdLine, int nCmdShow)
{
  InstanceHandle = hInstance;
Avatar billede the_fox Nybegynder
12. september 2006 - 20:34 #8
Ok nu fejler den ikke når jeg kompilerer, men jeg får stadig ikke mit ikon vist. Har du nogle gode ideer? :)
Avatar billede bertelbrander Novice
12. september 2006 - 20:45 #9
Prøv at poste hele koden
Avatar billede the_fox Nybegynder
12. september 2006 - 20:53 #10
jeg har lige sendt en mail til den mail du har på din hjemmeside...
Avatar billede bertelbrander Novice
12. september 2006 - 21:13 #11
Du skal bruge WM_INITDIALOG og ikke WM_CREATE.
Dialogboxe der laves med DialogBox modtager ikke WM_CREATE, men WM_INITDIALOG.

(Det er vist for længe siden jeg har lavet dialogboxe på den måde.)
Avatar billede the_fox Nybegynder
12. september 2006 - 21:23 #12
Har du prøvet kompilere det? Altså hvor du får ikonet vist? Det virker nemlig ikke på min. :(
Avatar billede the_fox Nybegynder
12. september 2006 - 21:32 #13
jeg har prøvet at fjerne DS_MODALFRAME fra style i rc-filen og det gør at der vises det der standard ikon fra windows.
Avatar billede bertelbrander Novice
12. september 2006 - 21:38 #14
Du har det til at stå under WM_COMMAND, det skal det ikke.

Prøv at flytte det op i starten af DlgProc så der kommer til at stå:

BOOL CALLBACK DlgProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam)
{
    switch(Message)
    {
        case WM_INITDIALOG:
        {
            HICON SmallIcon = LoadIcon(InstanceHandle, MAKEINTRESOURCE(201));
            HICON LargeIcon = LoadIcon(InstanceHandle, MAKEINTRESOURCE(201));
            SendMessage(hwnd, WM_SETICON, ICON_SMALL, (LPARAM )SmallIcon);
            SendMessage(hwnd, WM_SETICON, ICON_BIG, (LPARAM )LargeIcon);
        }
        break;
        case WM_COMMAND:
    switch(LOWORD(wParam))
Avatar billede the_fox Nybegynder
12. september 2006 - 21:43 #15
hold kæft hvor jeg sover!!! Det gør det da også. Og der var også her fejlen var. Nu virker det. Tusind tak for hjælpen. :) Vil du stadig ikke have points?
Avatar billede bertelbrander Novice
12. september 2006 - 21:46 #16
Nej tak.
Avatar billede the_fox Nybegynder
12. september 2006 - 21:52 #17
ok - men du får stadig et kæmpe tak herfra!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester