Avatar billede kamikaze Nybegynder
13. september 2003 - 22:29 Der er 7 kommentarer og
1 løsning

Spin Button Control (Up/Down Control) i Windows API

Hej.

Er der nogen der ved hvordan en Spin Button Control (også kaldet en up/down control) fungerer i Win32 API (ikke MFC)?

Jeg har en dialogbox hvorpå der er en række edit boxe, og til hver edit box vil jeg gerne have en spin button. Så vidt jeg har kunnet læse mig til, kan man sætte en 'buddy' til spin control'en, men jeg kan kun finde MFC dokumentationen og det er ikke en MFC applikation.

På forhånd tak.
Avatar billede bertelbrander Praktikant
14. september 2003 - 01:10 #1
I rc-filen for din dialog putter du noget der ligner:
EDITTEXT        IDC_EDIT1,26,25,39,13,ES_AUTOHSCROLL
CONTROL        "Spin2",IDC_SPIN2,"msctls_updown32",UDS_SETBUDDYINT |                    UDS_AUTOBUDDY | UDS_ARROWKEYS, 67, 25, 16, 16

På denne måde finder den selv ud af at den skal matche spin button'en med edit box'en.

For at få det til at virke skal du huske at kalde InitCommonControls() inden du kalder DialogBox(...), f.ex i WinMain().

Du skal også huske at linke med comctl32.lib

Du kan bruge følgende til at sætte range for din spin/edit:
HWND SpinHWnd = GetDlgItem(hDlg, IDC_SPIN2);
SendMessage(SpinHWnd, UDM_SETRANGE, 0, MAKELPARAM(25, 0));
Hvor 25 er max og 0 er min (det sidste 0).
Avatar billede kamikaze Nybegynder
15. september 2003 - 14:57 #2
Tak, jeg prøver lige.
Avatar billede kamikaze Nybegynder
15. september 2003 - 15:07 #3
Jeg mangler vist en header ell. lign:
error C2065: 'InitCommonControls' : undeclared identifier
Avatar billede kamikaze Nybegynder
15. september 2003 - 15:14 #4
Header:
#include "commctrl.h"
Avatar billede kamikaze Nybegynder
15. september 2003 - 15:30 #5
Ahhhh, det er rækkefølgen i .rc-filen der afgør hvem der er 'buddy'.

Ok, det virker nu, men jeg har 3 problemer:

1) Jeg kan ikke få UDM_SETRANGE til at virke
2) Jeg skal bruge negative værdier, og
3) Jeg skal bruge floating point værdier

Ved du (eller andre) hvordan jeg gør det?
Avatar billede kamikaze Nybegynder
15. september 2003 - 15:44 #6
Mht. 1 og 2 virker flg.:
SendMessage(SpinHWnd, UDM_SETRANGE, 0, MAKELONG(25, -25));
eller
SendMessage(SpinHWnd, UDM_SETRANGE32, -1000.0f, 1000.0f);

Men altså ikke MAKELPARAM()

Er der nogen der har prøvet at benyttes floats?
Avatar billede bertelbrander Praktikant
15. september 2003 - 20:35 #7
Jeg er ret sikker på at man ikke kan bruge andet en int's med en standard spin. Der vel også et problem med at definere hvor meget den skal ændre på tallet når der trykkes på knapperne.

Det burde være rimelig let at lave en simpel spin der virker med floats, vha to knapper.

Du kan i øvrigt bruge UDM_SETBUDDY til at fortælle din spin hvilken edit den skal modificere.
Avatar billede kamikaze Nybegynder
15. september 2003 - 23:02 #8
Ja, som standard kan man kun bruge int's. Men den sender en notifikation som kan fanges med WM_NOTIFY, og der kan man aflæse værdien (vha. UDM_GETPOS), dividere med fx. 100.0f, og så tælle sin værdi op i edit box'en manuelt.

På den måde kan man selvfølgelig ikke bruge autobuddy, så det bliver til en del mere kode - men det bliver nok måden jeg gør det på.

Tak for din hjælp, jeg kom da godt på sporet :o)
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