Avatar billede ladyhawke Novice
25. oktober 2004 - 13:05 Der er 31 kommentarer og
1 løsning

Opret antal checkboxe runtime

Jeg har en dialog, som skal indeholde et antal checkboxe (baseret på en ini fil).

Men hvordan tilføjer jeg checkboxe runtime til en dialog, så jeg kun viser det nødvendige antal boxe?
Avatar billede jakobdo Ekspert
25. oktober 2004 - 13:07 #1
Hvilket miljø koder du i?
Avatar billede ladyhawke Novice
25. oktober 2004 - 13:08 #2
visual c++ 7 men win32 (så ingen MFC)
Avatar billede jakobdo Ekspert
25. oktober 2004 - 13:17 #3
Kan du ikke bruge denne kode:

CreateWindow("BUTTON","CheckMe", WS_CHILD|WS_VISIBLE|BS_CHECKBOX, 10,10,100,40,hWnd, (HMENU) ID_CHECKBUTTON1, hInst, NULL);
Og så løbe dem igennem alt efter hvor mange du ønsker?
Avatar billede jakobdo Ekspert
25. oktober 2004 - 13:19 #4
Avatar billede ladyhawke Novice
25. oktober 2004 - 13:52 #5
men hvordan aflæser jeg så status på checkboxene bagefter?
Avatar billede ladyhawke Novice
25. oktober 2004 - 14:13 #6
og i øvrigt, hvordan få jeg dem lagt på dialogen IDD_CUSTOMINSTALL, jeg har ikke et handle til den lige nu...
Avatar billede jakobdo Ekspert
25. oktober 2004 - 14:16 #7
Hmmm...
Der knækker min film! :o(
Avatar billede ladyhawke Novice
25. oktober 2004 - 14:18 #8
jeg har navnet på min dialog, så det må jo være muligt at få et handle til den på en eller anden måde, men der er jo ikke meget ved at have checkboxene, hvis jeg ikke bagefter kan finde ud af hvad der står i dem...
Avatar billede jakobdo Ekspert
25. oktober 2004 - 14:24 #9
Din dialog, så kan du vel create dine checkboxe på den, ved:

CreateWindow("BUTTON","CheckMe", WS_CHILD|WS_VISIBLE|BS_CHECKBOX, 10,10,100,40,hWnd, (HMENU) ID_CHECKBUTTON1, hInst, NULL);

Ændre hWnd til dialoggens hwnd/handle;

Og jeg mener man kan finde et handle via en controls navn, men kan ikke lige finde metoden!
Avatar billede ladyhawke Novice
25. oktober 2004 - 14:32 #10
arbejder på det...
Avatar billede ladyhawke Novice
25. oktober 2004 - 15:05 #11
hmmm, har problemer med at få oprettet min dialog, så kan nogen hjælpe med en win32 dialog hvor man indsætter checkboxe som angivet tidligere i dette spørgsmål?
Avatar billede nlf Nybegynder
25. oktober 2004 - 16:29 #12
Det er ret tydeligt at du ikke har arbejdet særligt meget med Win32 API'et, og for at forhindre hundredevis af andre nemme (altså lette at slå op) spørgsmål, så begynd at søge på Microsoft Developer Network (msdn.com). Næsten alt (officielt) der omhandler Win32 API'et kan findes derinde.
Der er også Win32 hjælpen, men jeg ved ikke om den følger med Visual, og ellers kan den gratis downloads (kan dog ikke huske hvor). Forskellige tutorials kan altså også findes rundt omkring på nettet. Det er bare for at gøre det nemmere for både os og dig...
Avatar billede jakobdo Ekspert
25. oktober 2004 - 16:37 #13
NLF: Jeg synes ikke at SDK er nok, et spørgsmål som ladyhawke stiller her, er da ikke i den lette ende!

SDK kan hentes her: http://www.microsoft.com/msdownload/platformsdk/sdkupdate/XPSP2FULLInstall.htm
Avatar billede jakobdo Ekspert
25. oktober 2004 - 16:39 #14
Og generelt er SDK kodning noget indviklet noget, så hvis man vil, så er det da bare at spørge løs!
Et spørgsmål er altid nemt for en som kender løsningen! Men for en som ikke lige ved hvor man skal kigge eller lede, så kan eksperten jo være vejen frem!
Avatar billede ladyhawke Novice
25. oktober 2004 - 16:43 #15
MLF>> Nej du har ret jeg har ikke lavet meget win32, men har dog basal programmeringserfaring forskellige steder fra (hovedsageligt MFC/VCL i c++ og desuden c#).

Jeg har ledt en del i google groups etc. men ikke fundet så meget om hvordan man (som en del af en applikation) laver en ny dialog, med runtime definerede kontroller og hvordan man kommunikerer med samme.

Beklager hvis det generer dig med det spørgsmål, men det er åbenbart ikke så simpelt at svare på endda, siden jeg ikke er nået tættere på en brugbar løsning (har fået lavet en dialog, men ikke fået anbragt checkboxe på den og dermed heller ikke aflæst deres værdi)
Avatar billede ladyhawke Novice
25. oktober 2004 - 20:04 #16
ingen der kan klare en stump kode der tegner en dialog med et par knapper og ellers et vilkårligt (max 10) antal checkboxe?
Avatar billede bertelbrander Novice
25. oktober 2004 - 20:34 #17
Noget i stil med følgende ?

#include <windows.h>
#include <stdio.h>

#define ID_CHECKBUTTON1 1200
#define IDC_PUSH        1220

HINSTANCE InstanceHandle;
void CreateRadio(HWND hwndDlg)
{
  int i;
  for(i = 0; i < 10; i++)
  {
      char Title[32];
      sprintf(Title, "CheckMe %d", i);
      CreateWindow("BUTTON",
                  Title,
                  WS_CHILD|WS_VISIBLE|BS_AUTOCHECKBOX,
                  10, 10 + i * 30, 90, 14,
                  hwndDlg,
                  (HMENU)(ID_CHECKBUTTON1 + i),
                  InstanceHandle,
                  NULL);
  }
  CreateWindow("BUTTON",
                "PushMe",
                WS_CHILD|WS_VISIBLE|BS_DEFPUSHBUTTON,
                10, 320, 90, 20,
                hwndDlg,
                (HMENU)(IDC_PUSH),
                InstanceHandle,
                NULL);
}

void OnButton(HWND hwndDlg)
{
  int i;
  char Msg[1023] = "State: ";
  for(i = 0; i < 10; i++)
  {
      if(SendDlgItemMessage(hwndDlg, ID_CHECKBUTTON1 + i, BM_GETCHECK, 0, 0) == BST_CHECKED)
        strcat(Msg, "1");
      else
        strcat(Msg, "0");
  }
  MessageBox(hwndDlg, Msg, "Whatever", MB_OK);

}

LRESULT CALLBACK DialogProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam)
{
  switch(msg)
  {
  case WM_CREATE:
      CreateRadio(hwndDlg);
      break;
  case WM_COMMAND:
      if(LOWORD(wParam) == IDC_PUSH && HIWORD(wParam) == BN_CLICKED)
      {
        OnButton(hwndDlg);
      }
      break;
  }
  return DefWindowProc(hwndDlg, msg, wParam, lParam);
};

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR lpCmdLine, INT nCmdShow)
{
  WNDCLASS wc;
  InstanceHandle = hInstance;
  memset(&wc, 0, sizeof(WNDCLASS));
  wc.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;
  wc.lpfnWndProc = DialogProc;
  wc.hInstance = InstanceHandle;
  wc.hbrBackground = (HBRUSH )(COLOR_BTNFACE + 1);
  wc.lpszClassName = "WhateverClass";
  wc.hCursor = LoadCursor(NULL, IDC_ARROW);
  if(!RegisterClass(&wc))
      return FALSE;

  HWND WindowHandle = CreateWindow("WhateverClass",
                                    "Whatever",
                                    WS_MINIMIZEBOX | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_MAXIMIZEBOX | WS_CAPTION | WS_BORDER | WS_SYSMENU,
                                    100, 100, 100, 400,
                                    NULL,
                                    NULL,
                                    InstanceHandle,
                                    0);
  MSG Msg;
  while(GetMessage(&Msg, WindowHandle, 0, 0xFFFF) > 0)
  {
      if(!IsDialogMessage(WindowHandle, &Msg))
      {
        TranslateMessage(&Msg);
        DispatchMessage(&Msg);
      }
  }
  return 0;
}
Avatar billede ladyhawke Novice
26. oktober 2004 - 09:05 #18
kigger lige på det, men det ser fornuftigt ud umiddelbart
Avatar billede ladyhawke Novice
26. oktober 2004 - 09:18 #19
Det ser ud til at virke fint, så skal jeg bare have det pakket ind, så jeg lave en metode der viser dialogen og afleverer resultatet af checkboxenes markering...

bertelbrander>> Kan du ikke lægge et svar (gælder også jakobdo)

I har i hvert fald begge hjulpet mig videre
Avatar billede jakobdo Ekspert
26. oktober 2004 - 09:25 #20
Et lille svar fra mig...
Avatar billede ladyhawke Novice
26. oktober 2004 - 10:07 #21
afventer lige svar fra bertelbrander, så deler jeg velfortjente point ud
Avatar billede jakobdo Ekspert
26. oktober 2004 - 13:44 #22
Har lige leget lidt videre med BertelBranders eksempel:

#define WIN32_LEAN_AND_MEAN

#include <windows.h>
#include <stdlib.h>
#include <stdio.h>

#define ID_CHECKBUTTON1 1200
#define IDC_PUSH1      1210
#define IDC_PUSH2      1220

HINSTANCE InstanceHandle;

void ShowLastError(LPVOID caption)
{
    LPVOID lpMsgBuf;
  FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMsgBuf, 0, NULL);
  MessageBox( NULL, (char *)lpMsgBuf, (char *)caption, MB_ICONERROR );
  LocalFree( lpMsgBuf );
}

void CreateRadio(HWND hwndDlg)
{
    int i;
    HWND temp;
    HANDLE hFile;
    char lpBuffer[70000];
    int number;
    DWORD dwRead;
    DWORD dwSize;
    DWORD dwError;

    hFile = CreateFile(    "C://number.txt",                    // file to open
                          GENERIC_READ,                            // open for reading
                          FILE_SHARE_READ,                    // share for reading
                          NULL,                                            // default security
                          OPEN_EXISTING,                        // existing file only
                          FILE_ATTRIBUTE_NORMAL,        // normal file
                          NULL);                                        // no attr. template

    if (hFile == INVALID_HANDLE_VALUE)
    {
        ShowLastError("CreateFile");
    return;
    }
   
    dwSize = GetFileSize (hFile, NULL);
    if (dwSize == INVALID_FILE_SIZE)
    {
        ShowLastError("GetFileSize");
        CloseHandle(hFile);
        return;
    }
   
    LPSTR pszFileText;
  pszFileText = (LPSTR)GlobalAlloc(GPTR, dwSize + 1);
   
    if(!ReadFile(hFile, pszFileText, dwSize, &dwRead, NULL))
    {
        ShowLastError("ReadFile");
        CloseHandle(hFile);
        return;
    }
   
    number = atoi(pszFileText);
   
    GlobalFree(pszFileText);
    CloseHandle(hFile);
   
    for(i = 0; i < number; i++)
    {
        char Title[32];
        sprintf(Title, "CheckMe %d", i);
        temp = CreateWindow(    "BUTTON",
                  Title,
                  WS_CHILD|WS_VISIBLE|BS_AUTOCHECKBOX,
                  10, 10 + i * 30, 90, 14,
                  hwndDlg,
                  (HMENU)(ID_CHECKBUTTON1 + i),
                  InstanceHandle,
                  NULL);
        ShowWindow(temp, SW_SHOW);
  }
}

void CreateButtons(HWND hwndDlg)
{
  CreateWindow(    "BUTTON",
                "Create",
                WS_CHILD|WS_VISIBLE|BS_DEFPUSHBUTTON,
                10, 320, 90, 20,
                hwndDlg,
                (HMENU)(IDC_PUSH1),
                InstanceHandle,
                NULL);
  CreateWindow(    "BUTTON",
                "PushMe",
                WS_CHILD|WS_VISIBLE|BS_DEFPUSHBUTTON,
                10, 360, 90, 20,
                hwndDlg,
                (HMENU)(IDC_PUSH2),
                InstanceHandle,
                NULL);
}

void OnButton(HWND hwndDlg)
{
    int i;
    char Msg[1023] = "State: ";
    for(i = 0; i < 10; i++)
    {
        if(SendDlgItemMessage(hwndDlg, ID_CHECKBUTTON1 + i, BM_GETCHECK, 0, 0) == BST_CHECKED)
            strcat(Msg, "1");
        else
            strcat(Msg, "0");
    }
    MessageBox(hwndDlg, Msg, "Whatever", MB_OK);
}

LRESULT CALLBACK DialogProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam)
{
  switch(msg)
  {
  case WM_CREATE:
        CreateButtons(hwndDlg);
        break;
  case WM_COMMAND:
        if(LOWORD(wParam) == IDC_PUSH2 && HIWORD(wParam) == BN_CLICKED)
        {
            OnButton(hwndDlg);
        }
        if(LOWORD(wParam) == IDC_PUSH1 && HIWORD(wParam) == BN_CLICKED)
        {
            CreateRadio(hwndDlg);
        }
        break;
  }
  return DefWindowProc(hwndDlg, msg, wParam, lParam);
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, INT nCmdShow)
{
    UNREFERENCED_PARAMETER(lpCmdLine);
    UNREFERENCED_PARAMETER(nCmdShow);
    WNDCLASS wc;
    memset(&wc, 0, sizeof(WNDCLASS));
   
    if( !hPrevInstance )
    {
        wc.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;
      wc.lpfnWndProc = DialogProc;
      wc.hInstance = InstanceHandle;
      wc.hbrBackground = (HBRUSH )(COLOR_BTNFACE + 1);
      wc.lpszClassName = "WhateverClass";
      wc.hCursor = LoadCursor(NULL, IDC_ARROW);

        if (RegisterClass( &wc ) == NULL)
        {
            ShowLastError("RegisterClass");
            return false;
        }
    }
 
    InstanceHandle = hInstance;

  HWND WindowHandle = CreateWindow(    "WhateverClass",
                                    "Whatever",
                                    WS_MINIMIZEBOX | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_MAXIMIZEBOX | WS_CAPTION | WS_BORDER | WS_SYSMENU,
                                    100, 100, 100, 410,
                                    NULL,
                                    NULL,
                                    InstanceHandle,
                                    0);
  MSG Msg;
  while(GetMessage(&Msg, WindowHandle, 0, 0xFFFF) > 0)
  {
        if(!IsDialogMessage(WindowHandle, &Msg))
        {
            TranslateMessage(&Msg);
            DispatchMessage(&Msg);
        }
  }
  return 0;
}
Avatar billede ladyhawke Novice
26. oktober 2004 - 13:54 #23
nice :o)
Avatar billede jakobdo Ekspert
26. oktober 2004 - 13:59 #24
Og der kan du så lave en fil som hedder: c:\number.txt her skriver du blot et nummer! (f.eks 5)
Så laver den 5 checkboxe!
Så kan du evt selv lege videre! :o)
Avatar billede ladyhawke Novice
26. oktober 2004 - 14:44 #25
arbejder på det :o)
Avatar billede jakobdo Ekspert
26. oktober 2004 - 14:59 #26
Det mest optimale vil nok være at bruge en struct!
Avatar billede bertelbrander Novice
26. oktober 2004 - 20:06 #27
>jakobdo var det ikke lettere at bruge en ifstream til at læse med:

#include <iostream>
#include <fstream>

int main()
{
  std::ifstream File("whatever.txt");
  int n;
  if(File >> n)
      std::cout << "N: " << n << std::endl;
  else
      std::cerr << "Failed to read" << std::endl;
}

Husk at gemme tallet fra filen til OnButton().

>ladyhawke, jeg samler ikke på point.
Avatar billede jakobdo Ekspert
26. oktober 2004 - 20:20 #28
Bertel: Jo, men dem har jeg aldrig rigtig brugt!
Måske jeg skulle kigge nærmere på det, det var jo langt lettere! :o)
Avatar billede ladyhawke Novice
26. oktober 2004 - 20:25 #29
bertelbrander>> kan være, men du har nu ellers fortjent dem :o) Du valgte at svare i stedet for at bede mig læse dokumentationen til win32 API'et, som jo er lidt af en mundfuld...
Avatar billede ladyhawke Novice
27. oktober 2004 - 12:33 #30
hvis bertelbrander ikke lægger svar indenfor den næste times tid, tildeles pointene til jakobdo
Avatar billede ladyhawke Novice
28. oktober 2004 - 12:05 #31
ok jakobdo, her er point
Avatar billede jakobdo Ekspert
28. oktober 2004 - 12:37 #32
Takker...
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