Tags:
c++
java
Hej jeg ville nu til at lave mit lille lys program windows baseret så jeg har læst lidt windows programmering til c++ og det virker fint når man trykker på vinduet der kommer op så kommer der en dialogbox hvor der står "lyset er tændt" og lyset bliver også tændt men når man så trykker igen så kommer den anden dialog box "Lyset er slukket" men lyset slukker ikke og jeg kan ikke se hvad der er galt men her er koden:
#include <iostream>
#include <stdio.h>
#include <windows.h>
const char g_szClassName[] = "myWindowClass";
int valg = 0;
void SetTimeOut(HANDLE Port, int sec)
{
COMMTIMEOUTS commtimeouts;
GetCommTimeouts(Port, &commtimeouts);
commtimeouts.ReadIntervalTimeout = 1000*sec;
commtimeouts.ReadTotalTimeoutMultiplier = 10;
commtimeouts.ReadTotalTimeoutConstant = 1000*sec;
SetCommTimeouts(Port, &commtimeouts);
}
void Tx(HANDLE Port, const char *data)
{
DWORD Dummy;
WriteFile(Port, data, strlen(data), &Dummy, 0);
WriteFile(Port, "\\r\\n", 2, &Dummy, 0);
}
void Rx(HANDLE Port)
{
char Buffer[128];
DWORD Length, i;
ReadFile(Port, Buffer, 128, &Length, 0);
for(i = 0; i < Length; i++)
if(Buffer != '\\r')
printf("%c", Buffer);
}
// Step 4: the Window Procedure
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch(msg)
{
case WM_LBUTTONDOWN:
{
DCB dcb;
HANDLE ComPort = CreateFile("COM1", GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);
GetCommState(ComPort, &dcb);
dcb.BaudRate = 9600;
dcb.ByteSize = 8;
dcb.fRtsControl = RTS_CONTROL_DISABLE;
dcb.fOutxCtsFlow = 1;
SetCommState(ComPort, &dcb);
SetTimeOut(ComPort, 1);
if(valg == 0)
{
dcb.fRtsControl = RTS_CONTROL_ENABLE;
SetCommState(ComPort, &dcb);
MessageBox(NULL, "Lyset er nu tændt!", "Lys", MB_OK); //Her har jeg tilføjet min kode
valg = valg + 1;
}
else
{
dcb.fRtsControl = RTS_CONTROL_DISABLE;
MessageBox(NULL, "Lyset er nu slukket!", "Sluk", MB_OK);
SetCommState(ComPort, &dcb);
valg = valg - 1;
}
}
break;
case WM_CLOSE:
DestroyWindow(hwnd);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd, msg, wParam, lParam);
}
return 0;
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{
WNDCLASSEX wc;
HWND hwnd;
MSG Msg;
//Step 1: Registering the Window Class
wc.cbSize = sizeof(WNDCLASSEX);
wc.style = 0;
wc.lpfnWndProc = WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wc.lpszMenuName = NULL;
wc.lpszClassName = g_szClassName;
wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
if(!RegisterClassEx(&wc))
{
MessageBox(NULL, "Window Registration Failed!", "Error!",
MB_ICONEXCLAMATION | MB_OK);
return 0;
}
// Step 2: Creating the Window
hwnd = CreateWindowEx(
WS_EX_CLIENTEDGE,
g_szClassName,
"Mit første program!",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, 240, 120,
NULL, NULL, hInstance, NULL);
if(hwnd == NULL)
{
MessageBox(NULL, "Window Creation Failed!", "Error!",
MB_ICONEXCLAMATION | MB_OK);
return 0;
}
ShowWindow(hwnd, nCmdShow);
UpdateWindow(hwnd);
// Step 3: The Message Loop
while(GetMessage(&Msg, NULL, 0, 0) > 0)
{
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
return Msg.wParam;
}
14 svar postet i denne tråd vises herunder
0 indlæg har modtaget i alt 0 karma
0
Her er en lidt mindre version af programmet:
#include <iostream>
#include <stdio.h>
#include <windows.h>
const char g_szClassName[] = "myWindowClass";
int valg = 0;
void SetTimeOut(HANDLE Port, int sec)
{
COMMTIMEOUTS commtimeouts;
GetCommTimeouts(Port, &commtimeouts);
commtimeouts.ReadIntervalTimeout = 1000*sec;
commtimeouts.ReadTotalTimeoutMultiplier = 10;
commtimeouts.ReadTotalTimeoutConstant = 1000*sec;
SetCommTimeouts(Port, &commtimeouts);
}
// Det er her alle eventsne forgår
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch(msg)
{
case WM_LBUTTONDOWN:
{
DCB dcb;
HANDLE ComPort = CreateFile("COM1", GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);
GetCommState(ComPort, &dcb);
dcb.BaudRate = 9600;
dcb.ByteSize = 8;
dcb.fRtsControl = RTS_CONTROL_DISABLE;
dcb.fOutxCtsFlow = 1;
SetCommState(ComPort, &dcb);
SetTimeOut(ComPort, 1);
if(valg == 0)
{
dcb.fRtsControl = RTS_CONTROL_ENABLE;
SetCommState(ComPort, &dcb);
MessageBox(NULL, "Lyset er nu tændt!", "Lys", MB_OK); //Her har jeg tilføjet min kode
valg = valg + 1;
}
else
{
dcb.fRtsControl = RTS_CONTROL_DISABLE;
MessageBox(NULL, "Lyset er nu slukket!", "Sluk", MB_OK);
SetCommState(ComPort, &dcb);
valg = valg - 1;
}
}
break;
case WM_CLOSE:
DestroyWindow(hwnd);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd, msg, wParam, lParam);
}
return 0;
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{
WNDCLASSEX wc;
HWND hwnd;
MSG Msg;
//Registering af vindue classen
wc.cbSize = sizeof(WNDCLASSEX);
wc.style = 0;
wc.lpfnWndProc = WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wc.lpszMenuName = NULL;
wc.lpszClassName = g_szClassName;
wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
if(!RegisterClassEx(&wc))
{
MessageBox(NULL, "Window Registration Failed!", "Error!",
MB_ICONEXCLAMATION | MB_OK);
return 0;
}
//Lav vinduet
hwnd = CreateWindowEx(
WS_EX_CLIENTEDGE,
g_szClassName,
"Mit første program!",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, 240, 120,
NULL, NULL, hInstance, NULL);
if(hwnd == NULL)
{
MessageBox(NULL, "Window Creation Failed!", "Error!",
MB_ICONEXCLAMATION | MB_OK);
return 0;
}
ShowWindow(hwnd, nCmdShow);
UpdateWindow(hwnd);
//Besked løkken
while(GetMessage(&Msg, NULL, 0, 0) > 0)
{
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
return Msg.wParam;
}
0
Du skal lukke porten når du er færdig med den. Du lukker den med:
CloseHandle(ComPort);
Du kan også lave det om så den kun åbner porten én gang (CreteFile(...)).
Du bør nok også checke om CreateFile kunne åbne porten. CreateFile returnerer INVALID_HANDLE_VALUE hvis ikke porten kunne åbnes (dvs at ComPort bliver sat til at være INVALID_HANDLE_VALUE hvis ikke porten kunne åbnes).
0
Hej bertel jeg har prøvet den med CloseHandle(ComPort);
men det hjælper ikke noget! Hvad er det du mener med Createfile(); for den har jeg jo brugt en gang næsten i toppen af programmet og hvad mener du med INVALID_HANDLE_VALUE er det sådan at man skal kunne tjekke om der er fejl eller hvad og hvis der så er fejl så udskriver den det???
0
I de andre programmer bliver CreateFile kun kaldt én gang, når programmet starter op, i dette program bliver den kaldt hver gang du trykker med musen. Man kan kun have porten åben én gang så hvis du vil åbne den hver gang man trykker med musen skal du lukke den når du er færdig med den.
Jeg har indført ændringerne i koden:
case WM_LBUTTONDOWN:
{
DCB dcb;
HANDLE ComPort = CreateFile("COM1", GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);
if(ComPort == INVALID_HANDLE_VALUE)
{
MessageBox(hwnd, "Failed to open port", "Whatever", MB_OK);
return 1;
}
GetCommState(ComPort, &dcb);
dcb.BaudRate = 9600;
dcb.ByteSize = 8;
dcb.fRtsControl = RTS_CONTROL_DISABLE;
dcb.fOutxCtsFlow = 1;
// SetCommState(ComPort, &dcb); We don't need this one, it's done below
SetTimeOut(ComPort, 1);
if(valg == 0)
{
dcb.fRtsControl = RTS_CONTROL_ENABLE;
SetCommState(ComPort, &dcb);
valg = valg + 1;
MessageBox(hwnd, "Lyset er nu tændt!", "Lys", MB_OK); //Her har jeg tilføjet min kode
}
else
{
dcb.fRtsControl = RTS_CONTROL_DISABLE;
SetCommState(ComPort, &dcb);
valg = valg - 1;
MessageBox(hwnd, "Lyset er nu slukket!", "Sluk", MB_OK);
}
CloseHandle(ComPort);
}
break;
Bemærk at jeg har byttet om på SetCommState og MessageBox, så den ændrer på porten inden den viser boxen.
0
Ok jeg fik det til at virke og gik videre med den windows programmering guide jeg vil nemlig læse indtil jeg i hvert fald kan skrive noget på skræmen i et vindue da jeg har fået lavet min vindmåler og jeg bare mangler at lave programmet windows baseret! Nå men jeg gik videre i guiden og kom til hvordan man bruger ressource filer her er koden:
Windows.cpp:
#include <iostream>
#include <stdio.h>
#include <windows.h>
#include "resource.h"
#define IDI_MYICON 101
HICON hMyIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_MYICON));
const char g_szClassName[] = "myWindowClass";
int valg = 0;
void SetTimeOut(HANDLE Port, int sec)
{
COMMTIMEOUTS commtimeouts;
GetCommTimeouts(Port, &commtimeouts);
commtimeouts.ReadIntervalTimeout = 1000*sec;
commtimeouts.ReadTotalTimeoutMultiplier = 10;
commtimeouts.ReadTotalTimeoutConstant = 1000*sec;
SetCommTimeouts(Port, &commtimeouts);
}
// Det er her alle eventsne forgår
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch(msg)
{
case WM_LBUTTONDOWN:
{
DCB dcb;
HANDLE ComPort = CreateFile("COM1", GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);
GetCommState(ComPort, &dcb);
dcb.BaudRate = 9600;
dcb.ByteSize = 8;
dcb.fRtsControl = RTS_CONTROL_DISABLE;
dcb.fOutxCtsFlow = 1;
SetTimeOut(ComPort, 1);
dcb.fRtsControl = RTS_CONTROL_ENABLE;
SetCommState(ComPort, &dcb);
MessageBox(NULL, "Lyset er nu tændt det slukker igen når du trykker ok!", "Lys", MB_OK);
CloseHandle(ComPort);
}
break;
case WM_CLOSE:
DestroyWindow(hwnd);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd, msg, wParam, lParam);
}
return 0;
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{
WNDCLASSEX wc;
HWND hwnd;
MSG Msg;
//Registering af vindue classen
wc.cbSize = sizeof(WNDCLASSEX);
wc.style = 0;
wc.lpfnWndProc = WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wc.lpszMenuName = NULL;
wc.lpszClassName = g_szClassName;
wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
if(!RegisterClassEx(&wc))
{
MessageBox(NULL, "Window Registration Failed!", "Error!",
MB_ICONEXCLAMATION | MB_OK);
return 0;
}
//Lav vinduet
hwnd = CreateWindowEx(
WS_EX_CLIENTEDGE,
g_szClassName,
"Mit første program!",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, 240, 120,
NULL, NULL, hInstance, NULL);
if(hwnd == NULL)
{
MessageBox(NULL, "Window Creation Failed!", "Error!",
MB_ICONEXCLAMATION | MB_OK);
return 0;
}
ShowWindow(hwnd, nCmdShow);
UpdateWindow(hwnd);
//Besked løkken
while(GetMessage(&Msg, NULL, 0, 0) > 0)
{
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
return Msg.wParam;
}
resource.h:
#include "resource.h"
#define IDI_MYICON 101
#define ID_FILE_EXIT 4001
IDI_MYICON ICON "ikon.ico"
IDR_MYMENU MENU
BEGIN
POPUP "&File"
BEGIN
MENUITEM "E&xit", ID_FILE_EXIT
END
END
Hmm det virker ikke når jeg compiler cpp programmet så kommer der en masse henvisninger til resource.h filen og når jeg compiler resource.h filen kommer der følgende compiler og linker error:
gcc: Compilation of header file requested
gcc: file path prefix `C:\\DEV-C_~1\\Bin\\' never used
0
Jeg er ret sikker på at disse linier skal flyttes til en .rc fil:
IDI_MYICON ICON "ikon.ico"
IDR_MYMENU MENU
BEGIN
POPUP "&File"
BEGIN
MENUITEM "E&xit", ID_FILE_EXIT
END
END
Du skal tilføje #include "resource.h" til .rc filen og måske også inkludere windows.h
Man kompilerer normalt ikke .h filer direkte.
Dette spørgsmål har ikke så meget med det oprindelige spørgsmål at gøre, og burde derfor være stillet i en ny tråd.
Når du poster kode så put det i en blok med [ pre ] kode her [ / pre ] uden mellemrum, så er det lettere at læse.
0
cpp filen:
#include <iostream>
#include <stdio.h>
#include <windows.h>
#include "resource.h"
#define IDI_MYICON 101
HICON hMyIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_MYICON));
const char g_szClassName[] = "myWindowClass";
int valg = 0;
void SetTimeOut(HANDLE Port, int sec)
{
COMMTIMEOUTS commtimeouts;
GetCommTimeouts(Port, &commtimeouts);
commtimeouts.ReadIntervalTimeout = 1000*sec;
commtimeouts.ReadTotalTimeoutMultiplier = 10;
commtimeouts.ReadTotalTimeoutConstant = 1000*sec;
SetCommTimeouts(Port, &commtimeouts);
}
// Det er her alle eventsne forgår
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch(msg)
{
case WM_LBUTTONDOWN:
{
DCB dcb;
HANDLE ComPort = CreateFile("COM1", GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);
GetCommState(ComPort, &dcb);
dcb.BaudRate = 9600;
dcb.ByteSize = 8;
dcb.fRtsControl = RTS_CONTROL_DISABLE;
dcb.fOutxCtsFlow = 1;
SetTimeOut(ComPort, 1);
dcb.fRtsControl = RTS_CONTROL_ENABLE;
SetCommState(ComPort, &dcb);
MessageBox(NULL, "Lyset er nu tændt det slukker igen når du trykker ok!", "Lys", MB_OK);
CloseHandle(ComPort);
}
break;
case WM_CLOSE:
DestroyWindow(hwnd);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd, msg, wParam, lParam);
}
return 0;
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{
WNDCLASSEX wc;
HWND hwnd;
MSG Msg;
//Registering af vindue classen
wc.cbSize = sizeof(WNDCLASSEX);
wc.style = 0;
wc.lpfnWndProc = WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wc.lpszMenuName = NULL;
wc.lpszClassName = g_szClassName;
wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
if(!RegisterClassEx(&wc))
{
MessageBox(NULL, "Window Registration Failed!", "Error!",
MB_ICONEXCLAMATION | MB_OK);
return 0;
}
//Lav vinduet
hwnd = CreateWindowEx(
WS_EX_CLIENTEDGE,
g_szClassName,
"Mit første program!",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, 240, 120,
NULL, NULL, hInstance, NULL);
if(hwnd == NULL)
{
MessageBox(NULL, "Window Creation Failed!", "Error!",
MB_ICONEXCLAMATION | MB_OK);
return 0;
}
ShowWindow(hwnd, nCmdShow);
UpdateWindow(hwnd);
//Besked løkken
while(GetMessage(&Msg, NULL, 0, 0) > 0)
{
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
return Msg.wParam;
}
resource.rs filen
#include "resource.h"
#define IDI_MYICON 101
#define ID_FILE_EXIT 4001
IDI_MYICON ICON "ikon.ico"
IDR_MYMENU MENU
BEGIN
POPUP "&File"
BEGIN
MENUITEM "E&xit", ID_FILE_EXIT
END
END
Når jeg så compiler cpp filen får jeg følgende fejl:
4 c:\\docume~1\\johan\\skrive~1\\windows.cpp
resource.h: No such file or directory
0
Du har en resource.h i samme mappe som .cpp - filen ?
Der skal ikke stå #include "resource.h" i resource.h - filen
Du skal måske tilføje nuværende mappe til include path (kan blot angives med .)
Ligger .cpp, .rc og resource.h i samme mappe som project filen ?
Du bruger dev-cpp ?
0
Hej bertel hvad skal der stå i resource.h filen for du sagde jo at jeg skulle flytte det over i en .rc fil istedet men skal jeg både have en .rc og en resource.h eller hvad i .rc filen står følgende:
resource.rc
#include "resource.h"
#define IDI_MYICON 101
#define ID_FILE_EXIT 4001
IDI_MYICON ICON "ikon.ico"
IDR_MYMENU MENU
BEGIN
POPUP "&File"
BEGIN
MENUITEM "E&xit", ID_FILE_EXIT
END
END
0
Og ja jeg har lagt alle filerne i samme mappe jeg mangler bare resource.h filen men den trode jeg ikke jeg skulle bruge hvad skal der stå i den???