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; }
|
|