Avatar billede sw_red_6 Nybegynder
26. november 2004 - 12:24 Der er 42 kommentarer og
1 løsning

hvor finder man hwnd på en Dialog?

Jeg har en dialog med et editfelt og div. knapper. En af de knapper kalder en funktion som skal skrive noget i editfeltet.
For at det kan lade sig gøre bruger jeg det her kode SetDlgItemText(IDC_EDIT1, tmpString);
Problemet er bare at for at det skal virke skal den funktion have 3 input. SetDlgItemText(HWND, int, unsigned short *).
Hvad jeg har kunnet læse mig frem til er at HWND er noget handle men jeg kan ikke finde noget sted hvor jeg evt. vil kunne finde handle på den dialog hvor editfeltet er.
Avatar billede ranglen Nybegynder
26. november 2004 - 12:38 #2
Mig der sover :)

Det handle skal du gerne have fået ved oprettelse af din dialog
Avatar billede sw_red_6 Nybegynder
26. november 2004 - 12:49 #3
er der mulighed for at finde det handle nogen andre steder end ved oprettelsen af min dialog?
Avatar billede jpk Nybegynder
26. november 2004 - 13:20 #4
Hvorfor vil du ikke gemme dialogens handle når den oprettes?
Avatar billede sw_red_6 Nybegynder
26. november 2004 - 13:24 #5
øhhh, hvad mener du? gemme dialogens handle? Jeg har brugt appwizard til at lave en dialogbaseret app så jeg har ikke selv siddet og skrevet al koden til den dialog. Det er derfor jeg vil vide om jeg kan finde handle et eller andet sted. Det står sikkert i koden et sted men jeg kan ikke lige gennemskue al den tekst som VC++ genererede.
Avatar billede wisen Nybegynder
26. november 2004 - 13:27 #6
Prøv med GetSafeHwnd()
Avatar billede jpk Nybegynder
26. november 2004 - 13:29 #7
Nå, men så er det jo en MFC-app, ikke?
Så kan du bare bruge this->m_hWnd.

Men hvis du bruger MFC, kan du jo gøre det mere simpelt ved blot at oprette en membervariabel for editfeltet...
Avatar billede sw_red_6 Nybegynder
26. november 2004 - 13:30 #8
hvor skal jeg skrive det henne? i min dialog eller i den funktion jeg kalder?
Avatar billede jpk Nybegynder
26. november 2004 - 13:31 #9
Men hvis det er en MFC-app, skal SetDlgItemText IKKE have et HWND!
Avatar billede sw_red_6 Nybegynder
26. november 2004 - 13:44 #10
Jeg glemte at skrive at den funktion jeg kalder ligger i en anden fil. Det er derfor SetDlgItemText skal bruge HWND.
Avatar billede jpk Nybegynder
26. november 2004 - 15:12 #11
Kan du ikke prøve at vise den kode der opretter/viser dialogen og den der skal sætte teksten i editfeltet?
Avatar billede sw_red_6 Nybegynder
03. december 2004 - 09:04 #12
Beklager at jeg ikke har svaret før nu men det har været ret hektisk den sidste uge.
er det her nok mht opret/vis dialog?

CPCDlg::CPCDlg(CWnd* pParent /*=NULL*/)
    : CDialog(CPCDlg::IDD, pParent)
{
    //{{AFX_DATA_INIT(CPCDlg)
    m_editfelt = _T("");
    //}}AFX_DATA_INIT
    // Note that LoadIcon does not require a subsequent DestroyIcon in Win32
    m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CPCDlg::DoDataExchange(CDataExchange* pDX)
{
    CDialog::DoDataExchange(pDX);
    //{{AFX_DATA_MAP(CPCDlg)
    DDX_Text(pDX, IDC_EDIT1, m_editfelt);
    //}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CPCDlg, CDialog)
    //{{AFX_MSG_MAP(CPCDlg)
    ON_WM_SYSCOMMAND()
    ON_WM_PAINT()
    ON_WM_QUERYDRAGICON()
    ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
    ON_BN_CLICKED(IDC_BUTTON2, OnButton2)
    ON_BN_CLICKED(IDC_BUTTON3, OnButton3)
    ON_BN_CLICKED(IDC_BUTTON4, OnButton4)
    ON_BN_CLICKED(IDC_BUTTON5, OnButton5)
    ON_BN_CLICKED(IDC_BUTTON6, OnButton6)
    ON_BN_CLICKED(IDC_BUTTON7, OnButton7)
    ON_EN_CHANGE(IDC_EDIT1, OnChangeEdit1)
    ON_WM_CANCELMODE()
    //}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CPCDlg message handlers

BOOL CPCDlg::OnInitDialog()
{
    CDialog::OnInitDialog();

    // Add "About..." menu item to system menu.

    // IDM_ABOUTBOX must be in the system command range.
    ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
    ASSERT(IDM_ABOUTBOX < 0xF000);

    CMenu* pSysMenu = GetSystemMenu(FALSE);
    if (pSysMenu != NULL)
    {
        CString strAboutMenu;
        strAboutMenu.LoadString(IDS_ABOUTBOX);
        if (!strAboutMenu.IsEmpty())
        {
            pSysMenu->AppendMenu(MF_SEPARATOR);
            pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
        }
    }

    // Set the icon for this dialog.  The framework does this automatically
    //  when the application's main window is not a dialog
    SetIcon(m_hIcon, TRUE);            // Set big icon
    SetIcon(m_hIcon, FALSE);        // Set small icon
   
    // TODO: Add extra initialization here
   
    return TRUE;  // return TRUE  unless you set the focus to a control
}

void CPCDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
    if ((nID & 0xFFF0) == IDM_ABOUTBOX)
    {
        CAboutDlg dlgAbout;
        dlgAbout.DoModal();
    }
    else
    {
        CDialog::OnSysCommand(nID, lParam);
    }
}

det her er koden der skal sætte teksten i editfeltet:

void CPCDlg::OnButton2()
{
    char tmpString[20]="hello world \r\n";
    write(tmpString);
}

void write(char *s)
{
    CString tmpString;
    tmpString = s;
    SetDlgItemText(IDC_EDIT1, tmpString);
}

problemet er så at SetDlgItemText(IDC_EDIT1, tmpString); skal have et hwnd foran IDC_EDIT1 for at virke og det kan jeg ikke lige finde.
Avatar billede jpk Nybegynder
03. december 2004 - 09:12 #13
Jeg kan se at du allerede har en membervariabel til editfeltet, altså er det ret simpelt:

m_editfelt = "hello world";
UpdateData(false);
Avatar billede sw_red_6 Nybegynder
03. december 2004 - 09:33 #14
øhh og det virker hvis jeg har write(char *s) i PC.cpp og det andet ligger i PCDlg.cpp?
Avatar billede jpk Nybegynder
03. december 2004 - 09:38 #15
Du skal slet ikke bruge write-funktionen for at sætte værdien ved tryk på en knap.

void CPCDlg::OnButton2()
{
  m_editfelt = "hello world";
  UpdateData(false);
}


Hvis du vil sætte værdien der hvor du opretter dialogen, kan du gøre sådan:

CPCDlg dlg;
dlg.m_editfelt = "hello world";
dlg.DoModal();
Avatar billede sw_red_6 Nybegynder
03. december 2004 - 09:43 #16
jep, det er har jeg fat i. Problemet er bare at jeg skal kunne udskrive til det editfelt fra en funktion i en anden fil.
Jeg ved godt at "hello, world" kendetegner begynderprogrammer men det er nemmere at bruge når man skal teste om noget virker før man går helt amok fordi man har skrevet hele sit program og det så ikke virker når man tester det.
Avatar billede jpk Nybegynder
03. december 2004 - 09:46 #17
Så du bruger Create til at vise dialogen, ikke DoModal?
Avatar billede sw_red_6 Nybegynder
03. december 2004 - 10:02 #18
Aner det ikke. Jeg har ikke selv skrevet koden, det lod jeg den wizard ting gøre for mig. Kan det her have noget med det at gøre: CDialog::OnInitDialog(); ?
Avatar billede jpk Nybegynder
03. december 2004 - 10:15 #19
Okay, så er det måske dialogbaseret app?
..hvor CPCDlg er main-dialog?
Avatar billede jpk Nybegynder
03. december 2004 - 10:16 #20
Hvorfra vil du ændre teksten i edit-feltet?
Altså er det fra en anden dialog eller..?
Avatar billede sw_red_6 Nybegynder
03. december 2004 - 10:28 #21
Det er ganske rigtigt en dialogbaseret app og CPCDlg er ganske rigtigt main-dialog. Det glemte jeg vidst at skrive.
Avatar billede sw_red_6 Nybegynder
03. december 2004 - 10:28 #22
hmmm det bliver en længere forklaring det her. Jeg har et program som kan køre på et apparat. Dette program skal omstruktureres så det kan køres på en PC. Det har jeg ordnet men for at få vist output fra de forskellige funktioner der er i det program er det nødvendigt at bruge MFC da programmet er skrevet i C++ (C# kan ikke bruges det har jeg forsøgt). Jeg ved ikke om det er nemmere at lave med MDI eller SDI i stedet for lave det dialogbaseret.
Avatar billede jpk Nybegynder
03. december 2004 - 10:38 #23
Du bør IKKE blande din forretningslogik (dine "forskellige funktioner") sammen med din GUI!

Altså, en funktion der "beregner et eller andet", skal ikke kende noget til præsentationslaget...

Returnerer dine funktioner ikke et resultat?
Avatar billede sw_red_6 Nybegynder
03. december 2004 - 10:46 #24
det er der problemet ligger, jeg fjols!! hehe, nå så må jeg til at lave alle de funktioner som er lavet i assembler om til alm. C++ funktioner der returnerer de ting jeg skal bruge.
Avatar billede jpk Nybegynder
03. december 2004 - 11:03 #25
Hvis du vil have et handle til dialogen, kan du bruge følgende:

AfxGetMainWnd()->m_hWnd

Men det er ikke pænt at opdatere vinduet "udefra".
Avatar billede sw_red_6 Nybegynder
03. december 2004 - 11:29 #26
argh, hvordan får jeg den til at fatte at den skal returnere en char [13]? (Hello, World)
Avatar billede jpk Nybegynder
03. december 2004 - 11:55 #27
Hvad med at returnere en CString eller en STL string?
Avatar billede sw_red_6 Nybegynder
03. december 2004 - 12:03 #28
der er jeg ved at kigge på. der er bare meget der skal læses.
Avatar billede sw_red_6 Nybegynder
03. december 2004 - 12:28 #29
OK den går helt amok over at jeg skriver extern CString WriteTest(); i min .h fil. Hvis jeg skriver det så for jeg besked om at der mangler et ; før identifier 'WriteTest', hvis ikke jeg gør det skriver den undeclared identifier.
*Den=compiler*
Avatar billede jpk Nybegynder
03. december 2004 - 12:44 #30
Prøv at lave en:

#include <afxwin.h>

øverst i filen
Avatar billede sw_red_6 Nybegynder
03. december 2004 - 13:02 #31
include i en header-fil? Det er som regel ret skidt
Avatar billede jpk Nybegynder
03. december 2004 - 13:06 #32
Øh, nå..?

Hvilken løsning skulle være bedre?
Har du en .cpp fil med implementationen?
Avatar billede sw_red_6 Nybegynder
03. december 2004 - 13:10 #33
jeg kan godt forklare det lidt. jeg har en fil kaldet PC_Target.H som bl.a indeholder extern CString WriteTest();.

Så har jeg en fil kaldet PC_Target.CPP hvor WriteTest er implementeret. Funktionen er ret simpel, den ser således ud:

CString WriteTest()
{
    CString test = "Hello, World";
    return test;
}
Avatar billede jpk Nybegynder
03. december 2004 - 13:26 #34
Du får jo fejlen fordi compileren ikke kender CString...
(fordi den ikke er included)
Avatar billede sw_red_6 Nybegynder
03. december 2004 - 13:36 #35
jeg får først fejlen når jeg builder mit projekt. Hvis ikke jeg havde inkluderet de rigtige .h-filer burde jeg også få en fejl hvis jeg compiler PC_Target.CPP, hvilket jeg ikke gør. Jeg er lettere frustreret, det kan ikke være fordi jeg bruger den CString test forkert?
Avatar billede jpk Nybegynder
03. december 2004 - 13:41 #36
Nej, koden med "CString test..." er okay...

Du kunne self. bare skrive:

return "Hello, World";

(men det gør ikke nogen forskel mht. din fejl)
Avatar billede sw_red_6 Nybegynder
03. december 2004 - 14:01 #37
Nu begynder det at blive irriterende. Jeg har ændret lidt på koden.

extern void WriteTest(); i stedet for extern CString WriteTest();

og

void WriteTest()
{
    CString test;
    test = "Hello, World";
    AfxMessageBox(test);
}

i stedet for

CString WriteTest()
{
    CString test = "Hello, World";
    return test;
}

Nu er der ingen fejl og jeg kan få den messagebox frem og der står Hello, World i den.

jeg har altså isoleret fejlen til at være i PC_Target.H filen, men hvordan for man den til at genkende CString, da det tilsyneladende er det der går galt.
Avatar billede jpk Nybegynder
03. december 2004 - 14:35 #38
Har du prøvet #include <afxwin.h>?
Avatar billede sw_red_6 Nybegynder
03. december 2004 - 16:44 #39
Ja, men så gik den amok og sage der var ca. 20 fejl fordi den er inkluderet flere gange
Avatar billede jpk Nybegynder
03. december 2004 - 23:19 #40
Så lav en typisk guard:

#ifndef PC_TARGET_H
#define PC_TARGET_H

// kode

#endif // PC_TARGET_H
Avatar billede sw_red_6 Nybegynder
10. december 2004 - 11:08 #41
Jeg har hele tiden haft det her i PC_Target.H:
#ifndef TARGET_HDR
#define TARGET_HDR

PC_TARGET_DECL  CString  WriteTest(CString tmp);

#endif // TARGET_HDR

hvis jeg sætter den #include ind for jeg en masse fejl fordi den er inkluderet flere gange.
Avatar billede sw_red_6 Nybegynder
10. december 2004 - 11:20 #42
Jeg har fundet ud af det. Smid et svar så kan du få dine point
Avatar billede jpk Nybegynder
10. december 2004 - 11:23 #43
Svar!
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