C++ Winapi Mauskoordinaten ausgeben

Chakky

Member of Honour
Hi HaBo,

ich versuche mich gerade an der WinApi unter C++.

Nachdem ich gestern in ein paar Stunden arbeit einen Textausgeben konnte und eine Messagebox per Mausklick, würde ich gerne jetzt die aktuellen Mauskoordinaten ausgeben. Sprich wo befinden sich mein Mauszeiger im Fenster.
Ich hab einige Tutorials gestern Nacht gefunden wo Dreiecke, Vierecke und so gezeichnet wird mit hilfe von Mauskoordinaten, es wird aber nirgendswo genau die Position ausgeben.
Ich hab das Problem das die Daten als Integer vorliegen aber ich sie nicht als Text ausgegeben bekomme. Mit casten von int auf char wie in der Konsole geht leider nicht.

Könnte mir jemand einen denk Anstoß geben?

Ich hab es wiefolgt versucht
Code:
case WM_MOUSEMOVE:
	
  GetCursorPos (&pt); 
	x=pt.x;
	y=pt.y;
   hDC = BeginPaint(hWnd,&ps);
       sprintf_s(szBuffer, TEXT("X:%i Y:%i"),x,y); 
   EndPaint(hWnd,&ps);
   InvalidateRect;
   return 0;

Leider Funktioniert es nicht, deswegen auch im vollständigen Programm auskommentiert. Das Programm wird von VisualStudio wie folgt beendet:
"Microsoft Visual Studio C Runtime Library hat einen schwerwiegenden Fehler in Mau.exe gefunden"

Code:
#define STRICT
#include <windows.h>
#include <string>
#include <stdio.h>
#include <string.h>

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

const char szAppName[]    = "Textausgabe im Anwendungsbereich";

int WINAPI WinMain(  HINSTANCE hInstance, HINSTANCE hPrevInstance,
                     PSTR szCmdLine, int iCmdShow)
{
   MSG        msg;
   HWND       hWnd;
   WNDCLASS   wc;
   
   wc.style               = CS_HREDRAW | CS_VREDRAW;
   wc.lpfnWndProc         = WndProc;
   wc.cbClsExtra          = 0;
   wc.cbWndExtra          = 0;
   wc.hInstance           = hInstance;
   wc.hCursor             = LoadCursor(NULL, IDC_ARROW);
   wc.hIcon               = LoadIcon(NULL, IDI_APPLICATION);
   wc.hbrBackground       = (HBRUSH) GetStockObject(WHITE_BRUSH);
   wc.lpszClassName       = szAppName;
   wc.lpszMenuName        = NULL;
   
   RegisterClass(&wc);
   
   hWnd = CreateWindow(   szAppName,
                          szAppName,
                          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;
}


LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	
	static POINT pt={0}; //pointer initalisieren und statisch machen
	static int x,y;
	//char posi[];s
	char szBuffer[10];
	
      switch(message)
{
	case WM_PAINT:
		 PAINTSTRUCT ps;
	HDC hDC;
	
	 hDC = BeginPaint(hWnd, &ps);
	 TextOutA(hDC,50,50, "Blablabla", 10);
	 EndPaint(hWnd, &ps);
		 
	 return 0;
		 
	
	case WM_LBUTTONDOWN: 
		GetCursorPos (&pt); 
	x=pt.x;
	y=pt.y;
	

	MessageBox(NULL, "Test",NULL, NULL); //test für button down
	
	//xw=x;
	//yw=y;
    //ScreenToClient(hWnd, &pt); // screen coords to client coords 
	
	InvalidateRect(hWnd, NULL, FALSE);     

    return 0;
	
	case WM_MOUSEMOVE:
	
  GetCursorPos (&pt); 
	x=pt.x;
	y=pt.y;
   hDC = BeginPaint(hWnd,&ps);
       sprintf_s(szBuffer, TEXT("X:%i Y:%i"),x,y); 
   EndPaint(hWnd,&ps);
   InvalidateRect;
   return 0;
   
	

    case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
	default:
		return DefWindowProc(hWnd, message, wParam, lParam);
	}
	
}

Meine Umgebungsdaten:
Windows 7 Home 64bit,
Visual Studio 2010 Premium
Compiler Zeichensatz: Mulitbyte

Danke!

//Update: Es gab gerade in der chatbox den Hinweis über ein Extra Konsolenfenster das auszugeben, das will ich vermeiden. Ich will diesen zusammengeschusterten Code als Grundlage nehmen für ein SDK einer Hardware und die erfordert die WinApi und keine weitere Consolen ausgabe....
 
Zuletzt bearbeitet:
So auf Anhieb:
Code:
sprintf_s(szBuffer, TEXT("X:%i Y:%i"),x,y);
sprintf möchte doch noch die SizeOfBuff Werte haben ;)
Ansonsten wäre der klassische Weg doch sowas:
Code:
stringstream str_stream;
str_stream << my_num
xyz=str_stream.str()

Edit:
so:
Code:
sprintf_s(szBuffer, 20,TEXT("X:%i Y:%i"),x,y); 
TextOutA(hDC,50,80,szBuffer,strlen(szBuffer));
läuft wunderbar (szBuffer auch auf 20 setzen, denn 10 Zeichen dürften nicht genügen: "X: Y:" sind 5 + 6 Ziffern > 10).

Edit2:
kompletter Code
Code:
#include "stdafx.h"
#define MAX_LOADSTRING 100
#define STRICT
#include <windows.h>
#include <string>
#include <stdio.h>
#include <string.h>
#include <sstream>

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

const char szAppName[]    = "Textausgabe im Anwendungsbereich";

int WINAPI WinMain(  HINSTANCE hInstance, HINSTANCE hPrevInstance,
                     PSTR szCmdLine, int iCmdShow)
{
   MSG        msg;
   HWND       hWnd;
   WNDCLASS   wc;
   
   wc.style               = CS_HREDRAW | CS_VREDRAW;
   wc.lpfnWndProc         = WndProc;
   wc.cbClsExtra          = 0;
   wc.cbWndExtra          = 0;
   wc.hInstance           = hInstance;
   wc.hCursor             = LoadCursor(NULL, IDC_ARROW);
   wc.hIcon               = LoadIcon(NULL, IDI_APPLICATION);
   wc.hbrBackground       = (HBRUSH) GetStockObject(WHITE_BRUSH);
   wc.lpszClassName       = szAppName;
   wc.lpszMenuName        = NULL;
   
   RegisterClass(&wc);
   
   hWnd = CreateWindow(   szAppName,
                          szAppName,
                          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;
}


LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	
	static POINT pt={0}; //pointer initalisieren und statisch machen
	static int x,y;
	//char posi[];s
	char szBuffer[20];

	
      switch(message)
{
	case WM_PAINT:
		 PAINTSTRUCT ps;
	HDC hDC;
	
	 hDC = BeginPaint(hWnd, &ps);
	 TextOutA(hDC,50,50, "Blablabla", 10);
	 sprintf_s(szBuffer, 20,TEXT("X:%i Y:%i"),x,y); 
	 TextOutA(hDC,50,80,szBuffer,strlen(szBuffer));
	 EndPaint(hWnd, &ps);
		 
	 return 0;
		 
	
	case WM_LBUTTONDOWN: 
		GetCursorPos (&pt); 
	x=pt.x;
	y=pt.y;
	

	//MessageBox(NULL, "Test",NULL, NULL); //test für button down
	
	//xw=x;
	//yw=y;
    //ScreenToClient(hWnd, &pt); // screen coords to client coords 
	
	InvalidateRect(hWnd, NULL, FALSE);     

    return 0;
	
	case WM_MOUSEMOVE:
	
  GetCursorPos (&pt); 
	x=pt.x;
	y=pt.y;
    InvalidateRect(hWnd, NULL, FALSE);    

   return 0;
   
	

    case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
	default:
		return DefWindowProc(hWnd, message, wParam, lParam);
	}
	
}
 
Zurück
Oben