Toon posts:

[C] Mijn 'eerste' winapp en ik kan niet 'tabben'

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik ben bezig met mijn eerste Windows programma vanaf scratch. De volgende code bouwt een formulier zonder gebruik te maken van resource files. Het probleem is dat ik niet met de TAB-toets door de velden kan lopen.
C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
static HWND hWndGConn;
static HWND hWndLAddr, hWndEAddr, hWndLPort, hWndEPort;
static HWND hWndCMsp, hWndCFrame, hWndCLinktest;

    switch (message)                  /* handle the messages */
    {
    case WM_CREATE:
//        hWndGConn=CreateWindow("Static"," Connection",WS_CHILD|WS_VISIBLE|WS_BORDER|WS_GROUP,
//                               0,0,750,100,
//                               hwnd,(HMENU)0,NULL,NULL);
        hWndLAddr=CreateWindow("STATIC","Hostname",WS_CHILD|WS_VISIBLE,
                               10,30,100,25,
                               hwnd,(HMENU)IDL_IPADDR,hInst,NULL);
        hWndEAddr=CreateWindow("EDIT","localhost",WS_CHILD|WS_VISIBLE|WS_BORDER|WS_TABSTOP,
                               110,30,250,25,
                               hwnd,(HMENU)IDE_IPADDR,hInst,NULL);
        hWndLPort=CreateWindow("STATIC","Service",WS_CHILD|WS_VISIBLE,
                               10,60,100,25,
                               hwnd,(HMENU)IDL_IPPORT,hInst,NULL);
        hWndEPort=CreateWindow("EDIT","4010",WS_CHILD|WS_VISIBLE|WS_BORDER|WS_TABSTOP,
                               110,60,250,25,
                               hwnd,(HMENU)IDE_IPPORT,hInst,NULL);
        hWndCMsp=CreateWindow("BUTTON","MSP",BS_CHECKBOX|WS_CHILD|WS_VISIBLE|WS_TABSTOP,
                               410,30,100,25,
                               hwnd,(HMENU)IDC_MSP,hInst,NULL);
        hWndCFrame=CreateWindow("BUTTON","Frame",BS_CHECKBOX|WS_CHILD|WS_VISIBLE|WS_TABSTOP,
                               510,30,100,25,
                               hwnd,(HMENU)IDC_FRAME,hInst,NULL);
        hWndCLinktest=CreateWindow("BUTTON","Linktest",BS_CHECKBOX|WS_CHILD|WS_VISIBLE|WS_TABSTOP,
                               610,30,100,25,
                               hwnd,(HMENU)IDC_LINKTEST,hInst,NULL);
                               
        SetFocus(hWndEAddr);
        break;
    case WM_DESTROY:
        PostQuitMessage (0);       /* send a WM_QUIT to the message queue */
        break;
    default:                       /* for messages that we don't deal with */
        return DefWindowProc (hwnd, message, wParam, lParam);
    }

    return 0;
}

Dit is zo ongeveer de hele code die ik tot nu toe heb; gebruikte compiler is Dev-Cpp (versie 4.9.8.5 (=V5 beta)).
Iemand enig idee.

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-05 23:07

.oisyn

Moderator Devschuur®

Demotivational Speaker

Geldt die tab navigatie niet alleen voor dialog boxes?

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 23-05 23:27

Tomatoman

Fulltime prutser

Nee.

Een goede grap mag vrienden kosten.


  • Suepahfly
  • Registratie: Juni 2001
  • Laatst online: 21-04 16:00
Ik ben geen c expert (lees noob) maar moet je niet iets doen met TabIndex oid

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-05 23:07

.oisyn

Moderator Devschuur®

Demotivational Speaker

En wat mag TabIndex dan wel zijn :?

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Topicstarter
.oisyn schreef op 20 mei 2004 @ 14:12:Geldt die tab navigatie niet alleen voor dialog boxes?
Volgens mij niet.
Suepahfly schreef op 20 mei 2004 @ 16:05:Ik ben geen c expert (lees noob) maar moet je niet iets doen met TabIndex oid
Wordt bij mijn weten bepaalt door de volgorde waarin je ze op het 'formulier' plaatst; maar dat kan ik verkeerd hebben.

Iemand anders nog een idee?

  • koli-man
  • Registratie: Januari 2003
  • Laatst online: 13-05 14:28

koli-man

Bartender!!!!

.oisyn schreef op 20 mei 2004 @ 16:14:
En wat mag TabIndex dan wel zijn :?
Dat zal waarschijnlijk iets van Borland zijn, waarbij een tab component(of hoe heet dat ding) dat als property heeft.

[ Voor 8% gewijzigd door koli-man op 21-05-2004 10:25 ]

Hey Isaac...let's go shuffleboard on the Lido - deck...my site koli-man => MOEHA on X-Box laaaiiiff


Verwijderd

tabindex zorgt ervoor welk veld de volgende focus krijgt wanneer men op TAB drukt.

@ Sterretje:

De volgorde waarop je ze plaatst staat er los van, als je naderhand gaat schuiven op het formulier klopt de tabindex niet meer, vandaar dat je die ook in de properties mee kan geven.

Verwijderd

Moet je bij een normaal window bij de controls waar je tab functionaliteit in wil hebben niet gebruik maken van window subclassing? Bijvoorbeeld met getwindowlong(..,GWL_WNDPROC,..) en vervolgens als er een wm_keydown msg is de focus mbv setfocus naar de volgende control setten. Dit omdat alleen dialog boxen standaard tab functionaliteit hebben (ig in windows 95 :Y) )

Verwijderd

Topicstarter
koli-man schreef op 21 mei 2004 @ 10:24:
[...]


Dat zal waarschijnlijk iets van Borland zijn, waarbij een tab component(of hoe heet dat ding) dat als property heeft.
Nee, komt volgens mij in iedere visuele ontwikkelomgeving voor.
Verwijderd schreef op 21 mei 2004 @ 10:46:
tabindex zorgt ervoor welk veld de volgende focus krijgt wanneer men op TAB drukt.

@ Sterretje:

De volgorde waarop je ze plaatst staat er los van, als je naderhand gaat schuiven op het formulier klopt de tabindex niet meer, vandaar dat je die ook in de properties mee kan geven.
Welke properties :? Ik gebruik code om de controls te plaatsen, geen rc file.
Als ik een dialogbox maak met een resource editor, kan ik inderdaad in een visuele omgeving de tabindex zetten, maar hier werkt dat niet.
Verwijderd schreef op 21 mei 2004 @ 11:00:
Moet je bij een normaal window bij de controls waar je tab functionaliteit in wil hebben niet gebruik maken van window subclassing? Bijvoorbeeld met getwindowlong(..,GWL_WNDPROC,..) en vervolgens als er een wm_keydown msg is de focus mbv setfocus naar de volgende control setten. Dit omdat alleen dialog boxen standaard tab functionaliteit hebben (ig in windows 95 :Y) )
Dat is dan mooi shit (.iosyn gaf het ook al aan; zou hij dan toch gelijk hebben). Dat betekent dus 'kilometers' code 8)7 Ik kan geen dialogbox gebruiken omdat ik dan weer geen statusbar kan toevoegen (of zie ik dat verkeerd?).

Toch lastiger dan gedacht.

[ Voor 11% gewijzigd door Verwijderd op 21-05-2004 11:31 ]


  • madwizard
  • Registratie: Juli 2002
  • Laatst online: 26-10-2024

madwizard

Missionary to the word of ska

Je kunt gebruik maken van IsDialogMessage in je message pump. Die is ondanks z'n naam ook voor gewone windows te gebruiken (dit is ook officieel gedocumenteerd in de PSDK).

C++:
1
2
3
4
5
6
7
8
while (GetMessage(&msg, NULL, 0, 0)) 
{
    if (!IsDialogMessage(hWnd, &msg))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
}

Nu werkt WS_TABSTOP net zo als in een dialog.
Verwijderd schreef op 21 mei 2004 @ 11:28:
Ik kan geen dialogbox gebruiken omdat ik dan weer geen statusbar kan toevoegen (of zie ik dat verkeerd?).
Voor zover ik weet kan dat best hoor.

www.madwizard.org


Verwijderd

Verwijderd schreef op 21 mei 2004 @ 11:28:
[...]
Nee, komt volgens mij in iedere visuele ontwikkelomgeving voor.
[...]
Welke properties :? Ik gebruik code om de controls te plaatsen, geen rc file.
Als ik een dialogbox maak met een resource editor, kan ik inderdaad in een visuele omgeving de tabindex zetten, maar hier werkt dat niet.
[...]
Dat is dan mooi shit (.iosyn gaf het ook al aan; zou hij dan toch gelijk hebben). Dat betekent dus 'kilometers' code 8)7 Ik kan geen dialogbox gebruiken omdat ik dan weer geen statusbar kan toevoegen (of zie ik dat verkeerd?).

Toch lastiger dan gedacht.
dialog boxen ondersteunen ook toolbars, menu's en statusbarren, dus het is heel goed mogelijk om een dialoog te gebruiken

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

Verwijderd schreef op 21 mei 2004 @ 11:28:
[...]

Ik kan geen dialogbox gebruiken omdat ik dan weer geen statusbar kan toevoegen (of zie ik dat verkeerd?).
Dat zie je sowieso verkeerd :) Een dialogbox is niets anders dan een handig uitgegenereerde window met daardoor veel minder geneuzel aan window management dat het systeem reeds voor je afhandeld. In ruil daarvoor vanzelfsprekend een stuk minder flexibel, maar je blijft gewoon windows houden waarin je nieuwe child windows toe kunt voegen hoor. Ergo leef je uit met je statusbar :)

En madwizard heeft gelijk met de IsDialogMessage, zou wel nogal van de pot gerukt zijn als je dit met de hand moest schrijven daar tab-functionaliteit een mandatory onderdeel is volgens de Windows Application Development Style Guidelines. Ergo het hoort in iedere Windows app naar behoren te functioneren, en is daarom gestandaardiseerd.

Professionele website nodig?


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-05 23:07

.oisyn

Moderator Devschuur®

Demotivational Speaker

Verwijderd schreef op 21 mei 2004 @ 10:46:
tabindex zorgt ervoor welk veld de volgende focus krijgt wanneer men op TAB
Heb je een linkje uit de MSDN?
(ik weet natuurlijk ook wel wat die zogenaamde TabIndex zou moeten doen, maar we hebben het hier over native win32 zonder gebruik van een dialog template editor. Dan is er dus in de verste verte niet zoiets als een TabIndex)
Verwijderd schreef op 21 mei 2004 @ 11:28:
[...]
Nee, komt volgens mij in iedere visuele ontwikkelomgeving voor.
Sowieso niet in de resource editor van Visual Studio, maar zoals ik al zei, er wordt niet eens een visuele omgeving gebruikt voor het in elkaar zetten van dialogs. Hij creëert z'n windows met code, niet met dialog templates.
.edit: bliep, je bent zelf de topicstarter 8)7

[ Voor 3% gewijzigd door .oisyn op 24-05-2004 16:48 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Topicstarter
OK, ga ik me wel even verder in verdiepen in de dialogbox, kijken hoe ik daar een statusbar in kan krijgen.
De code was alleen in gebruik omdat ik veronderstelde dat het niet kon.
Allen dank.

[ Voor 78% gewijzigd door Verwijderd op 24-05-2004 13:50 ]


  • Korben
  • Registratie: Januari 2001
  • Laatst online: 14-11-2025

Korben

() => {};

.oisyn schreef op 23 mei 2004 @ 16:09:
[...]
Sowieso niet in de resource editor van Visual Studio, maar zoals ik al zei, er wordt niet eens een visuele omgeving gebruikt voor het in elkaar zetten van dialogs. ...
Really...?

Afbeeldingslocatie: http://kdn.cjb.net/meuk/taborder.jpg

En ja, het is niet letterlijk een TabIndex property, maar uiteindelijk heeft elke control wel een index in de tabvolgorde. Dus.

.oisyn: Échte programmeurs haten PHP met een passie. Ben jij soms geen echte programmeur?


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-05 23:07

.oisyn

Moderator Devschuur®

Demotivational Speaker

Korben schreef op 25 mei 2004 @ 02:10:
En ja, het is niet letterlijk een TabIndex property
En dat was nou precies waar het om ging :Y). Dus.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 20:56
Ik zit dit topic een beetje te volgen en ondanks we er nu over uit zijn dat Tab Order of TabIndex geen daadwerkelijke 'property' is en je de tab-functionaliteit kunt verkrijgen door je messages eerst door IsDialogMessage() te halen, is mij nog steeds niet duidelijk hoe die 'tab order' nu precies ingesteld wordt? Ik begrijp dat alleen controls met een WS_TABSTOP style in aanmerking komen, maar hoe wordt de volgorde nu bepaald?

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-05 23:07

.oisyn

Moderator Devschuur®

Demotivational Speaker

Het is simpelweg de volgorde waarin de controls zijn toegevoegd aan de parent window. Native win32 that is, geen idee of Borland's VCL een eigen tab handler heeft geimplementeerd. Tab order wijzingen in de resource editor zorgt er dus gewoon voor dat de controls in een andere volgorde in de dialog template wordt gezet (dit kun je zien door zo'n .rc file te openen in notepad oid)

[ Voor 39% gewijzigd door .oisyn op 25-05-2004 02:53 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

The WS_TABSTOP style specifies the controls to which the user can move by pressing the TAB key or SHIFT+TAB keys.

When the user presses TAB or SHIFT+TAB, the system first determines whether these keys are processed by the control that currently has the input focus. It sends the control a WM_GETDLGCODE message, and if the control returns DLGC_WANTTAB, the system passes the keys to the control. Otherwise, the system uses the GetNextDlgTabItem function to locate the next control that is visible, not disabled, and that has the WS_TABSTOP style. The search starts with the control currently having the input focus and proceeds in the order in which the controls were created—that is, the order in which they are defined in the dialog box template. When the system locates a control having the required characteristics, the system moves the input focus to it.

If the search for the next control with the WS_TABSTOP style encounters a window with the WS_EX_CONTROLPARENT style, the system recursively searches the window's children.

An application can also use GetNextDlgTabItem to locate controls having the WS_TABSTOP style. The function retrieves the window handle of the next or previous control having the WS_TABSTOP style without moving the input focus.
Uit VS.net online help :)

Professionele website nodig?

Pagina: 1