Avatar billede bjering Nybegynder
16. juni 2004 - 14:13 Der er 19 kommentarer og
1 løsning

Dialog, skal sende en listbox streng fra en anden dialog.

Nu er den gal igen (jeg er en nød til det her men det er sjovt nok, og jeg har jo alle jer til at redde mig)

Jeg bruger Microsoft Visual c++ 6 forresten.

spørgsmålet/problemet er:

Jeg har min "main" dialog hvor der er en listbox

IDC_LIST (wooo vildt navn)

Anyways, jeg har så en popup dialog hvor man kan ændre nogle settings, når man så klikker SAVE, skal den skrive en streng til min listbox.

problemet er, min kode er delt ud, så min settings dialog ting er i en anden .cpp/.h file

EG:

i min main.cpp fil:
[code]
        case ID_TOOLS_SETTINGS:
        {
        int ret = DialogBox(GetModuleHandle(NULL), MAKEINTRESOURCE(IDD_DBSETTINGS), hdwnd, DBSettingsDlgProc);
        }
        break;
[/code]

i min dbsetting.cpp fil:
[code]
BOOL CALLBACK DBSettingsDlgProc(HWND hdwnd, UINT Message, WPARAM wParam, LPARAM lParam)
{
    switch(Message)
    {
        case WM_INITDIALOG:
       
...............osvosvosv
længere nede skal den skrive en streng til min listbox i min main dialog.
    }
}
[/code]

jeg har included min resource.h fil i begge filerne self.

Jeg ved det er noget med jeg skal lave en message map så den ved hvor min listbox er, men hvad jeg ikke er helt klar over er hvordan.

jeg har rooodet rundt på nettet some en sindsyg men syntes ikke rigtig jeg kan finde noget.

BTW: det er Win32 Api.

jeg har prøvet at sætte en:

SendDlgItemMessage(hdwnd, IDC_LIST, LB_ADDSTRING, 0, (LPARAM)"Opened Database Settings Dialog.");

ind, men det funkede ikke.

har tid stødt ind i de her problemer så 200 points til dem/de der kan give mig en eksempel (og et par links ville oxo være rart, men en eksempel er meget bedre).

spørg bare løs hvis det er.
Avatar billede bjering Nybegynder
16. juni 2004 - 14:13 #1
okay code tags funkede ikke.. og man kan ikke edit sin besked :x
Avatar billede jpk Nybegynder
16. juni 2004 - 14:43 #2
Message maps bruges i MFC-kode, så det er ikke en mulighed her.

Hvilken returværdi får du fra SendDlgItemMessage?
Er hdwnd et gyldigt handle til winduet for din main dialog?
Avatar billede bjering Nybegynder
16. juni 2004 - 14:52 #3
har ikke lige luret min returværdi for senddlgitemmessage

min main windows start:

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszArgs, int nCmdShow )
{
  MSG msg;
  hMainInstance = hInstance;
  HWND hdwnd = 0;
  HACCEL    hAccelTable;
 
  hdwnd = CreateDialog(hMainInstance,
                      MAKEINTRESOURCE(IDD_DIALOG1),
                      NULL,
                      (DLGPROC)DialogFunc);
  if( !hdwnd ) return FALSE;

  ShowWindow( hdwnd, nCmdShow );
  UpdateWindow( hdwnd );

  hAccelTable = LoadAccelerators(hMainInstance, (LPCTSTR)IDR_ACCELERATOR1);
  while( GetMessage(&msg, NULL, 0, 0) )
  {
      if (IsDialogMessage(hdwnd, &msg)) continue;
      TranslateMessage( &msg );
      DispatchMessage( &msg );
  }
  return msg.wParam;
}

så min handle skulle gerne være hdwnd.

tjekker lige min returværdi om melder tilbage
Avatar billede jpk Nybegynder
16. juni 2004 - 14:58 #4
hdwnd er jo en lokal variabel for WinMain funktionen, men jeg forstod på dig at du kaldte SendDlgItemMessage fra en "anden" dialog hvor der så ikke er adgang til hdwnd eller hvad..?
Avatar billede bjering Nybegynder
16. juni 2004 - 15:02 #5
den returnerer (NULL)

det er jo ikke godt, den skulle gerne returnere min handle.
Avatar billede jpk Nybegynder
16. juni 2004 - 15:06 #6
SendDlgItemMessage med LB_ADDSTRING skulle gerne returnere indexet for elementet der blev oprettet i listboksen. Altså 0 hvis det er første kald, 1 hvis det er næste osv.
Avatar billede bjering Nybegynder
16. juni 2004 - 15:07 #7
jow, men det gør den jo så ikke :D

hmm kan godt være der ikke er adgang... roder lidt med det, er en smule noobie stadigvæk..
Avatar billede jpk Nybegynder
16. juni 2004 - 15:07 #8
Hvilken returværdi får du for hvert kald, hvis du fx kalder funktionen 3 gange?
Avatar billede jpk Nybegynder
16. juni 2004 - 15:08 #9
Er der nogle elementer i listboksen i forvejen, for ellers er værdien 0 jo rigtig nok.
Avatar billede bjering Nybegynder
16. juni 2004 - 15:10 #10
og ja jeg sender det fra en popup dialog (ligesom settings in IE) f,eks klikker setting og save, og så skriver den saved blabla i IE's windue (bare et eksempel).
Avatar billede bjering Nybegynder
16. juni 2004 - 15:10 #11
ja der er 1... men om jeg skriver 0 eller 1 eller 10, der kommer ingen tekst.
Avatar billede jpk Nybegynder
16. juni 2004 - 15:12 #12
Er det samme returværdi fra SendDlgItemMessage hver gang?
Avatar billede bjering Nybegynder
16. juni 2004 - 15:13 #13
btw, min primære dialog start ser sådan her ud, så den burde gerne have adgang til den.

BOOL CALLBACK DialogFunc(HWND hdwnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{
    INITCOMMONCONTROLSEX InitCtrlEx;

    InitCtrlEx.dwSize = sizeof(INITCOMMONCONTROLSEX);
    InitCtrlEx.dwICC  = ICC_PROGRESS_CLASS;
    InitCommonControlsEx(&InitCtrlEx);

  switch(Msg)
  {
    case WM_INITDIALOG:
    {

.............osvosv, længere nede kommer den    case ID_TOOLS_SETTINGS:

så burde den jo gerne vide hvor den skal smide det hen ikke?
Avatar billede bjering Nybegynder
16. juni 2004 - 15:13 #14
ja samme hver gang
Avatar billede bjering Nybegynder
16. juni 2004 - 15:33 #15
kan være det er den måde jeg laver min dialog mmm
Avatar billede jpk Nybegynder
16. juni 2004 - 16:08 #16
Variablen hdwnd i funktionen DialogFunc er ikke den samme som for din main dialog.
Den repræsenterer et handle til din settings dialog...
Avatar billede bjering Nybegynder
16. juni 2004 - 18:10 #17
okay jeg er ikke lige med, kan være det er fordi jeg er en bitte smule træt, har gloet på den her problem sidste 14 timer xD

anyways, sover et par timer og ser om jeg ikke kan fikse det når jeg står op igen (kan du sige hvad du mener med min hdwnd ikke er samme som min main dialog ???)
Avatar billede jpk Nybegynder
16. juni 2004 - 18:43 #18
Din CALLBACK funktion får et handle til et vindue som første parameter, fx:
BOOL CALLBACK DialogFunc(HWND hdwnd, UINT Msg, WPARAM wParam, LPARAM lParam)

Det er et handle til det vindue (den dialog) callback'en fungerer for, altså i ovenstående tilfælde din settings dialog, IKKE dit main wnd!

Jeg ved godt du har kaldt dem samme navn, men det er IKKE samme HWND.

Altså, når du kalder:
SendDlgItemMessage(hdwnd, IDC_LIST, LB_ADDSTRING, 0, (LPARAM)"Opened Database Settings Dialog.");

i din settings dialog, sendes en message til dialogen selv.

Du skal i stedet have fat i et handle (HWND) til main dialogen, du kan fx bruge en af disse metoder:
- GetParent(hdwnd) i stedet for hdwnd direkte (check om den returnerer en gyldig værdi først!)
- Gemme main dialogens handle i en global variabel og bruge den i SendDlgItemMessage-kaldet
Avatar billede bjering Nybegynder
17. juni 2004 - 02:26 #19
woot det virkede sq, skriv lige et svar :)))))))

btw addede det:

HWND mainwnd;

BOOL CALLBACK DBSettingsDlgProc(HWND hdwnd, UINT Message, WPARAM wParam, LPARAM lParam)
{
    mainwnd = GetParent(hdwnd);

    switch(Message)
    {
        case WM_INITDIALOG:
        int n;

osvosv............... i min settings dialog callback fil.
Avatar billede jpk Nybegynder
17. juni 2004 - 08:10 #20
Okay...
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