Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.04.2012, 19:28   #1
GanJIk
Пользователь
 
Регистрация: 11.11.2008
Сообщений: 14
По умолчанию Вывод координат окна на С++

В окне отображается текущие
координаты верхзнего левого угла окна и размер окна. При перетаскивании окна или изменений размеров
в окне также должны меняться

вот само окно
Код:
                                                                     
                                                                     
                                                                     
                                             
#include <windows.h>

// Дескриптор главного окна
HWND MainWindowHandle = 0; 

// Функция для создания и отображения окна
bool InitWindowsApp(HINSTANCE instanceHandle, int show); 

// Функция обработки сообщений приложения
int  Run();               
          
// Функция обработки сообщений главного окна
LRESULT CALLBACK WndProc(HWND hWnd,
                         UINT msg,
                         WPARAM wParam,
                         LPARAM lParam);

// Входная функция - эквивалент main() в Windows
int WINAPI WinMain(HINSTANCE hInstance,  
                   HINSTANCE hPrevInstance, 
                   PSTR      pCmdLine, 
                   int       nShowCmd)
{
    // Создание и отображение окна
    // В случае неудачи выводим сообщение об ошибке и выходим из программы
    if(!InitWindowsApp(hInstance, nShowCmd)) 
    {
        MessageBox(0, L"Init - FailedL", L"ErrorL", MB_OK);
        return 0;
    }

    // Вызываем функцию обработки сообщений
    return Run();
}

bool InitWindowsApp(HINSTANCE instanceHandle, int show)
{
    // Создание класса окна
    WNDCLASS wc; 

    wc.style         = CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc   = WndProc;
    wc.cbClsExtra    = 0;
    wc.cbWndExtra    = 0;
    wc.hInstance     = instanceHandle;
    wc.hIcon         = LoadIcon(0, IDI_APPLICATION);
    wc.hCursor       = LoadCursor(0, IDC_ARROW);
    wc.hbrBackground = 
    static_cast<HBRUSH>(GetStockObject(WHITE_BRUSH));
    wc.lpszMenuName  = 0;
    wc.lpszClassName = L"Командная строка";

    // Регистрация класса окна
    // В случае неудачи выводим сообщение об ошибке и возвращаем false
    if(!RegisterClass(&wc)) 
    {
        MessageBox(0, L"RegisterClass - FailedL", 0, 0);
        return false;
    }

    // Создаем окно
    MainWindowHandle = CreateWindow(
                           L"Командная строка",
                           L"Командная строка",
                           WS_OVERLAPPEDWINDOW,
                           CW_USEDEFAULT, 
                           CW_USEDEFAULT,
                           CW_USEDEFAULT,
                           CW_USEDEFAULT,
                           0,
                           0, 
                           instanceHandle,
                           0);
    
    // Если окно не было создано, выводим сообщени об ошибке и возвращаем false
    if(MainWindowHandle == 0)
    {
        MessageBox(0, L"CreateWindow - FailedL", 0, 0);
        return false;
    }

    // Отображаем созданное окно
    ShowWindow(MainWindowHandle, show);
    UpdateWindow(MainWindowHandle);

    // Возвращаем true
    return true;
}

int Run()
{
    MSG msg;
    ZeroMemory(&msg, sizeof(MSG));

    // Обработка входящих сообщений в цикле
    // GetMessage будет возвращать истину до тех пор, пока не будет получено сообщение WM_QUIT
    while(GetMessage(&msg, 0, 0, 0) )
    {
        // Транслируем сообщение и посылаем его функции обработке сообщений окна
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    return msg.wParam;
}

LRESULT CALLBACK WndProc(HWND   windowHandle,
                         UINT   msg,     
                         WPARAM wParam,
                         LPARAM lParam)
{
    // Обработка сообщений
    switch( msg )
    {
       
        // При нажатии Escape, уничтожаем главное окно программы
        case WM_KEYDOWN:
            if( wParam == VK_ESCAPE )
                DestroyWindow(MainWindowHandle);
            return 0;

        // При уничтожении окна, отправить сообщение о выходе для прерывания обработки сообщений
        case WM_DESTROY: 
            PostQuitMessage(0); 
            return 0;
    }

    // Обработка сообщений по умолчанию
    return DefWindowProc(windowHandle,
                           msg,
                           wParam,
                           lParam);
}
GanJIk вне форума Ответить с цитированием
Старый 01.04.2012, 20:46   #2
microbit
Форумчанин
 
Аватар для microbit
 
Регистрация: 26.09.2011
Сообщений: 176
По умолчанию

отлавливайте сообщения wm_size и wm_move и получайте координаты окна GetWindowRect
microbit вне форума Ответить с цитированием
Старый 01.04.2012, 21:55   #3
GanJIk
Пользователь
 
Регистрация: 11.11.2008
Сообщений: 14
По умолчанию

а не могли бы уточнить каким именно образом выводить, у меня есть две функции а че делать не знаю
WM_MOVE
xPos = (int) LOWORD(lParam);
yPos = (int) HIWORD(lParam);

WM_SIZE
fwSizeType = wParam;
nWidth = LOWORD(lParam);
nHeight = HIWORD(lParam);

Последний раз редактировалось GanJIk; 01.04.2012 в 22:22.
GanJIk вне форума Ответить с цитированием
Старый 01.04.2012, 22:41   #4
microbit
Форумчанин
 
Аватар для microbit
 
Регистрация: 26.09.2011
Сообщений: 176
По умолчанию

смотря куда выводить если в клиентскую область то примерно так

Код:
static RECT rect;
case WM_SIZE:
case WM_MOVE:
	GetWindowRect(hwnd,&rect);
	InvalidateRect(hwnd,NULL,NULL);
	return 0;
case WM_PAINT:
	HDC dc;
	PAINTSTRUCT ps;
	WCHAR szText[100];
	dc = BeginPaint(hwnd,&ps);
	wsprintf(szText,L"x=%d,y=%d",rect.left,rect.top);
	TextOut(dc,10,10,szText,wcslen(szText));
	EndPaint(hwnd,&ps);
	return 0;
microbit вне форума Ответить с цитированием
Старый 01.04.2012, 22:49   #5
GanJIk
Пользователь
 
Регистрация: 11.11.2008
Сообщений: 14
По умолчанию

попробовал вставлять код в свой не получается
GanJIk вне форума Ответить с цитированием
Старый 01.04.2012, 23:01   #6
microbit
Форумчанин
 
Аватар для microbit
 
Регистрация: 26.09.2011
Сообщений: 176
По умолчанию

Код:
#include <windows.h>

// Дескриптор главного окна
HWND MainWindowHandle = 0; 

// Функция для создания и отображения окна
bool InitWindowsApp(HINSTANCE instanceHandle, int show); 

// Функция обработки сообщений приложения
int  Run();               
          
// Функция обработки сообщений главного окна
LRESULT CALLBACK WndProc(HWND hWnd,
                         UINT msg,
                         WPARAM wParam,
                         LPARAM lParam);

// Входная функция - эквивалент main() в Windows
int WINAPI WinMain(HINSTANCE hInstance,  
                   HINSTANCE hPrevInstance, 
                   PSTR      pCmdLine, 
                   int       nShowCmd)
{
    // Создание и отображение окна
    // В случае неудачи выводим сообщение об ошибке и выходим из программы
    if(!InitWindowsApp(hInstance, nShowCmd)) 
    {
        MessageBox(0, L"Init - FailedL", L"ErrorL", MB_OK);
        return 0;
    }

    // Вызываем функцию обработки сообщений
    return Run();
}

bool InitWindowsApp(HINSTANCE instanceHandle, int show)
{
    // Создание класса окна
    WNDCLASS wc; 

    wc.style         = CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc   = WndProc;
    wc.cbClsExtra    = 0;
    wc.cbWndExtra    = 0;
    wc.hInstance     = instanceHandle;
    wc.hIcon         = LoadIcon(0, IDI_APPLICATION);
    wc.hCursor       = LoadCursor(0, IDC_ARROW);
    wc.hbrBackground = 
    static_cast<HBRUSH>(GetStockObject(WHITE_BRUSH));
    wc.lpszMenuName  = 0;
    wc.lpszClassName = L"Командная строка";

    // Регистрация класса окна
    // В случае неудачи выводим сообщение об ошибке и возвращаем false
    if(!RegisterClass(&wc)) 
    {
        MessageBox(0, L"RegisterClass - FailedL", 0, 0);
        return false;
    }

    // Создаем окно
    MainWindowHandle = CreateWindow(
                           L"Командная строка",
                           L"Командная строка",
                           WS_OVERLAPPEDWINDOW,
                           CW_USEDEFAULT, 
                           CW_USEDEFAULT,
                           CW_USEDEFAULT,
                           CW_USEDEFAULT,
                           0,
                           0, 
                           instanceHandle,
                           0);
    
    // Если окно не было создано, выводим сообщени об ошибке и возвращаем false
    if(MainWindowHandle == 0)
    {
        MessageBox(0, L"CreateWindow - FailedL", 0, 0);
        return false;
    }

    // Отображаем созданное окно
    ShowWindow(MainWindowHandle, show);
    UpdateWindow(MainWindowHandle);

    // Возвращаем true
    return true;
}

int Run()
{
    MSG msg;
    ZeroMemory(&msg, sizeof(MSG));

    // Обработка входящих сообщений в цикле
    // GetMessage будет возвращать истину до тех пор, пока не будет получено сообщение WM_QUIT
    while(GetMessage(&msg, 0, 0, 0) )
    {
        // Транслируем сообщение и посылаем его функции обработке сообщений окна
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    return msg.wParam;
}

LRESULT CALLBACK WndProc(HWND   windowHandle,
                         UINT   msg,     
                         WPARAM wParam,
                         LPARAM lParam)
{
    // Обработка сообщений
    switch( msg )
    {
		static RECT rect;
		case WM_SIZE:
		case WM_MOVE:
			GetWindowRect(windowHandle,&rect);
			InvalidateRect(windowHandle,NULL,NULL);
			return 0;
		case WM_PAINT:
			HDC dc;
			PAINTSTRUCT ps;
			WCHAR szText[100];
			dc = BeginPaint(windowHandle,&ps);
			wsprintf(szText,L"x=%d,y=%d,width=%d,height=%d",
				rect.left,rect.top,rect.right-rect.left,rect.bottom-rect.top);
			TextOut(dc,10,10,szText,wcslen(szText));
			EndPaint(windowHandle,&ps);
			return 0;
        // При нажатии Escape, уничтожаем главное окно программы
        case WM_KEYDOWN:
            if( wParam == VK_ESCAPE )
                DestroyWindow(MainWindowHandle);
            return 0;

        // При уничтожении окна, отправить сообщение о выходе для прерывания обработки сообщений
        case WM_DESTROY: 
            PostQuitMessage(0); 
            return 0;
    }

    // Обработка сообщений по умолчанию
    return DefWindowProc(windowHandle,
                           msg,
                           wParam,
                           lParam);
}
microbit вне форума Ответить с цитированием
Старый 01.04.2012, 23:06   #7
GanJIk
Пользователь
 
Регистрация: 11.11.2008
Сообщений: 14
По умолчанию

Спасибо за помощь!Очень сильно тебе благодарен!
GanJIk вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вывод видео в два окна Женя 24 Мультимедиа в Delphi 3 07.01.2012 15:06
Вывод трёхмерных координат. ТриСемёрки C++ Builder 0 08.03.2011 10:54
вывод координат shelest Помощь студентам 1 20.12.2009 13:44
Вывод данных в разные окна Absent Помощь студентам 0 07.06.2009 13:06