Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » Child Fenster erstellen

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
28.07.2007, 20:20 Uhr
~frederik_duese
Gast


Hallo

Ich hab hier ein kleines Problem. Ich hab hier ein kleines Programm geschrieben, dass Daten von der seriellen Schnittstelle empfängt und graphisch (in Form einer Polyline) darstellt. Nun gibt es einige Optionen, die man an diesem Programm einstellen muss (Port Nr., Baudrate, Vergrößerung,...) wenn man nun einen dieser Parameter verändern will muss man (zur Zeit) das Programm ändern, neu kompilieren und ausführen, was auf Dauer natürlich nervig und unpraktisch ist.

Deshalb wollte ich meinem Programm ein kleines zusätzliches Fenster schenken, in dem alle Einstellung in Form von Steuerelementen verpackt sind. Das Dazu ist es notwendig ein Chlidfenster mit einer RegisterClass und CreateWindow Anweisung an zu legen.

Das restliche Programm funktioniert soweit, darüber braucht ihr euch keine Sorgen zu machen. (sogar der Thread, der die Schnittstelle abfragt

Soweit so gut, ich hab's schließlich auch geschafft ein Childfenster an zu legen. Allerdings muss RegisterClass in der Window Prozedur aufgerufen werden und nicht in WinMain, was mich etwas irritiert obwohl ich damit leben könnte. In dem Programm, dass ich im Petzold gefunden habe (Checker3) funktioniert das aber.

Was aber stört ist, das ich in dem ChildFenster offenbar keine weiteren ChildFenster, also Steuerelemente anlegen kann. Warum? Ich habe das komische Gefühl, dass beide Probleme die gleiche Ursache haben.


C++:




/*
        program name:        COMM
        programmer:            fritz_feichtinger@aon.at
        description:        programm to receive and graph data from serial port

*/




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



#define        POINTS            64
#define        VALUES            256
#define        TIME            50
#define        BAUDRATE        CBR_9600
#define        PORT            TEXT("COM1")

/************************    global variables    ******************************/

HINSTANCE        hinst;
HANDLE            RS232;
//DWORD            events;
static TCHAR    szDlgName[] = TEXT("dialog_class");
bool            run;
int                count;
POINT            line[POINTS];
POINT            size;
unsigned char    data;

/************************    function prototypes    ******************************/

LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK DlgProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);
DWORD WINAPI WaitComm(PVOID pParam);

/************************    winmain function    ******************************/

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{
    static TCHAR    szAppName[] = TEXT ("COMM");
    WNDCLASS        wndclass;
    HWND            hwnd;
    MSG                msg;

    hinst=hInstance;

    wndclass.style            = CS_HREDRAW | CS_VREDRAW;
    wndclass.lpfnWndProc    = WndProc;
    wndclass.cbClsExtra        = 0;
    wndclass.cbWndExtra        = 0;
    wndclass.hInstance        = hInstance;
    wndclass.hIcon            = LoadIcon (NULL, IDI_APPLICATION);
    wndclass.hCursor        = LoadCursor (NULL, IDC_ARROW);
    wndclass.hbrBackground    = (HBRUSH) GetStockObject (WHITE_BRUSH);
    wndclass.lpszMenuName    = NULL;
    wndclass.lpszClassName    = szAppName;

    if (!RegisterClass (&wndclass))
    {
        MessageBox (NULL, TEXT (" Dieses Programm setzt Windows NT voraus!"), TEXT ("Warnung:"), MB_ICONERROR);
        return (0);
    }

    hwnd = CreateWindow (szAppName, TEXT ("COMM"),
        WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
        NULL, NULL, hInstance, NULL);

    ShowWindow (hwnd, iCmdShow);
    UpdateWindow (hwnd);

    while (GetMessage (&msg, NULL, 0, 0))
    {
        TranslateMessage (&msg);
        DispatchMessage (&msg);
    }
    return msg.wParam;
}

/************************    window procedure    ******************************/

LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{

    // don't forget 'static' in WndProc variables!
    static HWND        hdialog;

    switch(message)
    {
    case WM_CREATE:

        WNDCLASS    wndclass;
        DCB            settings;

        wndclass.style            = CS_HREDRAW | CS_VREDRAW;
        wndclass.lpfnWndProc    = DlgProc;
        wndclass.cbClsExtra        = 0;
        wndclass.cbWndExtra        = 0;
        wndclass.hInstance        = hinst;
        wndclass.hIcon            = NULL;
        wndclass.hCursor        = LoadCursor (NULL, IDC_ARROW);
        wndclass.hbrBackground    = (HBRUSH) GetStockObject (WHITE_BRUSH);
        wndclass.lpszMenuName    = NULL;
        wndclass.lpszClassName    = szDlgName;

        if (!RegisterClass (&wndclass))
        {
            MessageBox (NULL, TEXT (" Dieses Programm setzt Windows NT voraus!"), TEXT ("Warnung:"), MB_ICONERROR);
            return (0);
        }

        hdialog = CreateWindow (szDlgName,TEXT("Settings"),WS_VISIBLE, 0, 0, 200, 200, hwnd, NULL, hinst, NULL);

        if (hdialog == INVALID_HANDLE_VALUE)
        {
            MessageBox(NULL,TEXT("CreateWindow failed"),TEXT ("Warning:"),MB_ICONERROR);
            return 0;
        }
        
        RS232=CreateFile(PORT,GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING,NULL,NULL);
        if (RS232 == INVALID_HANDLE_VALUE)
        {
            MessageBox(NULL,TEXT("CreateFile failed"),TEXT ("Warning:"),MB_ICONERROR);
            return 0;
        }

        if(!GetCommState(RS232,&settings))
        {
            MessageBox(NULL,TEXT("GetCommState failed"),TEXT ("Warning:"),MB_ICONERROR);
            return 0;
        }
        settings.BaudRate=BAUDRATE;
        settings.ByteSize=8;
        settings.Parity=NOPARITY;
        settings.StopBits=ONESTOPBIT;

        if(!SetCommState(RS232,&settings))
        {
            MessageBox(NULL,TEXT("SetCommState failed"),TEXT ("Warning:"),MB_ICONERROR);
            return 0;
        }
        SetCommMask(RS232,EV_RXCHAR);

        run=true;
        //Thread=
        if(!CreateThread(NULL,NULL,WaitComm,NULL,NULL,NULL))
        {
            MessageBox(NULL,TEXT("CreateThread failed"),TEXT ("Warning:"),MB_ICONERROR);
            return 0;
        }

        count=0;
        SetTimer(hwnd,1,TIME,NULL);

        return 0;

    case WM_SIZE:

        size.x=LOWORD(lParam);
        size.y=HIWORD(lParam);
        return 0;

    case WM_TIMER:

        InvalidateRect(hwnd,NULL,true);
        return 0;
    
    case WM_PAINT:

        HDC                hdc;
        PAINTSTRUCT        ps;
        TCHAR            szbuffer[50];

        hdc = BeginPaint(hwnd,&ps);

        TextOut(hdc,0,0,szbuffer,sprintf(szbuffer,TEXT("%d"),data));
        Polyline(hdc,line,POINTS);

        EndPaint(hwnd,&ps);
        return 0;

    case WM_DESTROY:

        KillTimer(hwnd,1);
        run=false;
        PostQuitMessage(0);
        return 0;

     }

     return DefWindowProc (hwnd, message, wParam, lParam) ;
}

/************************    dialog procedure    ******************************/

LRESULT CALLBACK DlgProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    HWND    btn;
    switch(message)
    {
    case WM_CREATE:
        btn=CreateWindow(TEXT("button"),NULL,SBS_HORZ,10,10,50,10,hwnd,NULL,NULL,NULL);
        if (btn == INVALID_HANDLE_VALUE)
        {
            MessageBox(NULL,TEXT("CreateWindow failed"),TEXT ("Warning:"),MB_ICONERROR);
            return 0;
        }
        return 0;

    /*case WM_PAINT:
        PAINTSTRUCT        ps;
        HDC                hdc;

        hdc=BeginPaint(hwnd,&ps);
            Ellipse(hdc,10,10,20,20);
        EndPaint(hwnd,&ps);
        return 0;*/

    }
    return DefWindowProc(hwnd,message,wParam,lParam);
}

/************************    serial handling thread    ******************************/

DWORD WINAPI WaitComm(PVOID pParam)
{

    DWORD            received_bytes;

    while(run)
    {
        if(WaitCommEvent(RS232,NULL,NULL))
        {
                
            while(ReadFile(RS232,&data,1,&received_bytes,NULL))
            {
                line[count].x=size.x*count/POINTS;
                line[count].y=size.y*(VALUES-data)/VALUES;
                MessageBeep(-1);

                count++;
                if(count>=POINTS)
                {
                    count=0;
                }
            }
        }
    }
    return 0;
}


 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
31.07.2007, 09:49 Uhr
Oliver
S2-Pixelgeneral



Zitat:

Soweit so gut, ich hab's schließlich auch geschafft ein Childfenster an zu legen. Allerdings muss RegisterClass in der Window Prozedur aufgerufen werden und nicht in WinMain, was mich etwas irritiert obwohl ich damit leben könnte. In dem Programm, dass ich im Petzold gefunden habe (Checker3) funktioniert das aber.



Und was ist daran das Problem?


C++:
btn=CreateWindow(TEXT("button"),NULL,SBS_HORZ,10,10,50,10,hwnd,NULL,NULL,NULL);



Wieso erstellst du einen Button mit einem Scrollbar-Style?


Außerdem machst du es dir viel zu kompliziert. Dialoge erstellt man normalerweise mit Ressourcen und DialogBox(Param).
--
Demokratie ist die Diktatur der Mehrheit.

www.siedler25.org/ ( Siedler2 - Remake )
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (WinAPI, Konsole) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: