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

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

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 18.03.2010, 01:49   #11
Ulex
Непрофессионал
Участник клуба
 
Аватар для Ulex
 
Регистрация: 01.01.2008
Сообщений: 1,405
По умолчанию

Тип DWORD представляет из себя четыре байта, а что в этих четырёх байтах будет, дело ваше. Можете туда хоть 32-х битный float сложить.

Цитата:
DrawText(hDC, "Hello world!". -1, &rect, DT_SINGLE|DT_CENTER|DT_VCENTER);
У вас синтаксические ошибки, будьте внимательнее.
И чем больше я узнавал людей, тем больше мне нравились компьютеры.
------------------------------------
Страничка с моими программками http://ulex-masm.ru
Ulex вне форума Ответить с цитированием
Старый 19.03.2010, 16:14   #12
Dimarik
Форумчанин
 
Аватар для Dimarik
 
Регистрация: 18.04.2009
Сообщений: 688
По умолчанию

откомменте плиз
файл KWND.h
Код:
#include <windows.h>
class KWnd
{
public:
	KWnd(LPSTR windowName, HINSTANCE hInst, int cmdShow,
		LRESULT (WINAPI *pWndProc)(HWND, UINT, WPARAM, LPARAM), //??????
		LPCTSTR menuName = NULL,
		int x = CW_USEDEFAULT, int y = 0,
		int width = CW_USEDEFAULT, int height = 0,
		UINT classStyle = CS_HREDRAW|CS_VREDRAW,
		DWORD windowStyle = WS_OVERLAPPEDWINDOW,
		HWND hParent = NULL);
	HWND GetHwnd()
	{
		return hWnd;
	}
protected:
	HWND hWnd;
	WINDCLASSEX wc;
}
НЕПОНЯТНО: определение KWnd + ошибка на WINDCLASSEX wc;
файл KWnd.cpp
Код:
#include "KWnd.h"
KWnd::KWnd(LPSTR windowName, HINSTANCE hInst, int cmdShow,
		LRESULT (WINAPI *pWndProc)(HWND, UINT, WPARAM, LPARAM),
		LPSTR menuName, int x, int y, int width, int height,
		UINT classStyle, DWORD windowStyle, HWND hParent)
{
	char szClassName[] = "KWndClass";
	wc.cbSize = sizeof(wc);
	wc.Style = classStyle;
	wc.lpfnWndProc = pWndProc;
	wc.cbClsExtra = 0;
	wc.cbWndExtra = 0;
	wc.hInstance = hInst;
	wc.hIcon = LoadIcon(NILL, IDI_APPLICATION);
	wc.hCursor = LoadCursor(NULL, IDC_ARROW);
	wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BTUSH);
	wc.lpszMenuName = menuName;
	wc.lpszClassName = szClassName;
	wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
	//регестрируем класс окна

	if (!RegisterClassEx(&wc))
	{
		char msg[100] = "Cannot register class";
		strcat(msg, szClassName);//что делает
		MessageBox(NULL, msg, "ERROR", MB_OK);
		return;
	}
	//создаём окно
	hWnd = CreateWindow(szClassName, windowName, windowStyle, x, y,
		width, height, hParent, (HMENU)NULL, hInst, NULL);
	if (!hWnd)
	{
		char text [100] = "Cannot create window";
		strcat(text, windowName);
		MessageBox(NULL, text, "ERROR", MB_OK);
		return;
	}
	ShowWindow(hwnd, cmdShow);
}
файл Hello2.cpp
Код:
#include <windows.h>
#include "KWnd.h";
LRESULT CALLBACK WndProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam);

int WINAPI WncProc(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpszArgs,int nCmdShow)
{
    MSG msg;
	KWND mainWnd ("A HELLO@ APPLICATIOM", hInstance, nCmdShow, WndProc);
	while(GetMessage(&msg,0,0,0)!=NULL)
    {
        //А вот это уже ближе к делу: эта функция вызывает нашу процедуру 
		//обработки сообщений с параметрами из структуры MSG
        DispatchMessage(&msg);
    }
    return 0;
}

LRESULT CALLBACK WndProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
	HDC hDC;
	PAINTSTRUCT ps;
	RECT rect;
    //Все очень просто. То что нам надо мы обрабатываем.
    switch(uMsg)
    {
    //А нужно нам обрабатывать только сообщение WM_CLOSE
    //Система его присылает окну, когда окно пытаются закрыть. 
    //Скажем когда пользователь жмет на "Крестик". 
		case WM_CLOSE:
            //Эта функция сообщает системе что нам пора закрыватся. 
            //Единственный параметр - это код ошибки. 
            // 0 означает  "Нет Ошибки".
            PostQuitMessage(0);
			break; //После обработки сообщения - возвращаем результат.
		case WM_PAINT:
			hDC = BeginPaint(hWnd, &ps);
			GetClientRect(hWnd, &rect);
			DrawText(hDC, "Hello world!", -1, &rect,
				DT_SINGLELINE|DT_CENTER|DT_VCENTER);
			EndPaint(hWnd, &ps);
			break;
		default: 
			return DefWindowProc(hWnd,uMsg,wParam,lParam); 
        //То что не надо - передаем системе и она делает работу за нас.

    }
return 0;
}
непонятна строчка KWND mainWnd ("A HELLO@ APPLICATIOM", hInstance, nCmdShow, WndProc);
Народ, плиз, если можете, поясните почему
LRESULT CALLBACK WndProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
и
LRESULT WINAPI WndProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
как бы одно и то же? в одном источнике написано так писать, в другом иначе. и в результате и так и сяк работает. и что эти колбэк и винапи значат?
Dimarik вне форума Ответить с цитированием
Старый 19.03.2010, 16:29   #13
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

WNDCLASS
проверьте по буквам
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 19.03.2010, 17:03   #14
Dimarik
Форумчанин
 
Аватар для Dimarik
 
Регистрация: 18.04.2009
Сообщений: 688
По умолчанию

ну это да) если можно поясните плиз код) + там куча других ошибок.. не компилится(((
Dimarik вне форума Ответить с цитированием
Старый 19.03.2010, 17:37   #15
Ivan_32
somewhere else
Участник клуба
 
Аватар для Ivan_32
 
Регистрация: 17.07.2008
Сообщений: 1,409
По умолчанию

Dimarik, я бы не стал этим заниматься именно сейчас, как минимум. Я думаю лучше подумать над бинарной инкапсуляцией, а не классовой оберткой Тот же .NET это бинарная обертка над окнами + скриптовый движок который этой оберткой пользуется.
"Тяжело в учении, легко в бою" - А.В. Суворов
Ivan_32 вне форума Ответить с цитированием
Старый 19.03.2010, 18:26   #16
Dimarik
Форумчанин
 
Аватар для Dimarik
 
Регистрация: 18.04.2009
Сообщений: 688
По умолчанию

ну я как бы просто по порядку читаю книжку. Стараюсь вникнуть. не всё получается, но я ж только начинаю. Книжка Win32 Api. Разработка Windows приложений. Юрий Щупак

Ivan_32, если не впадлу, подскажи с этим кодом, ЛПИИИЗ

Последний раз редактировалось Stilet; 05.02.2011 в 15:58.
Dimarik вне форума Ответить с цитированием
Старый 20.03.2010, 10:57   #17
profi
Участник клуба Подтвердите свой е-майл
 
Регистрация: 19.11.2007
Сообщений: 1,022
По умолчанию

CALLBACK означает, что функция будет вызвана вне данной программы, т.е. её вызовет ОС Windows для передачи ей ообщения.
WINAPI это то самое, что и stdcall, т.е. аргументы в функцию передаются через стек, справа налево. Но лучше для функции обработки сообщений писать CALLBACK.

Последний раз редактировалось profi; 20.03.2010 в 14:06.
profi вне форума Ответить с цитированием
Старый 29.01.2011, 17:15   #18
Dimarik
Форумчанин
 
Аватар для Dimarik
 
Регистрация: 18.04.2009
Сообщений: 688
По умолчанию

СПАСИБО БОЛЬШОЕ

LRESULT CALLBACK WndProc....
А что значит LRESULT? это как я понимаю тип данных, который возвращает функция..... А что это за тип?
wc.lpfnWndProc = WndProc; - это вызывает что ли функцию???
но почему тогда без скобок()?

Последний раз редактировалось Stilet; 05.02.2011 в 15:59.
Dimarik вне форума Ответить с цитированием
Старый 29.01.2011, 20:56   #19
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Цитата:
А что значит LRESULT? это как я понимаю тип данных, который возвращает функция..... А что это за тип?
В МСДН и справке все есть.

Цитата:
это вызывает что ли функцию???
Нет, это не вызавает функцию. Это адрес функции, которую будет вызывать система. И да: это есть в МСДН и книгах.
p51x вне форума Ответить с цитированием
Старый 04.02.2011, 20:50   #20
Dimarik
Форумчанин
 
Аватар для Dimarik
 
Регистрация: 18.04.2009
Сообщений: 688
По умолчанию

Решил всё это запихнуть в класс:
Код:
#include <Windows.h>
class Window
{
	private:
		WNDCLASSEX windowStruct;//структура
	public:
		//конструкторы
		Window(char* caption, HINSTANCE hInstance);
		Window(WNDCLASSEX w, char* caption, HINSTANCE hInstance);
		LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
};
Код:
#include "Window_components.h"
#include <Windows.h>

Window::Window(char* caption, HINSTANCE hInstance)
{
	HWND hMainWnd;  
	char szClassName[] = "Window";
	MSG msg;
	
	// Заполняем структуру класса окна
	this->windowStruct.cbSize        = sizeof(this->windowStruct);		
	this->windowStruct.style         = CS_HREDRAW | CS_VREDRAW;
	this->windowStruct.lpfnWndProc   = Window::WndProc;
	this->windowStruct.cbClsExtra	 = 0;
	this->windowStruct.cbWndExtra    = 0;
	this->windowStruct.hInstance     = hInstance;
	this->windowStruct.hIcon         = LoadIcon(NULL, IDI_APPLICATION);
	this->windowStruct.hCursor       = LoadCursor(NULL, IDC_ARROW);
	this->windowStruct.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
	this->windowStruct.lpszMenuName  = NULL;
	this->windowStruct.lpszClassName = szClassName;
	this->windowStruct.hIconSm       = LoadIcon(NULL, IDI_APPLICATION);

	// Регистрируем класс окна
	if (!RegisterClassEx(&(this->windowStruct))) 
	{
		MessageBox(NULL, "Cannot register class", "Error", MB_OK);
		return;
	}
	
	// Создаем основное окно приложения
	hMainWnd = CreateWindow( 
		szClassName, caption, WS_OVERLAPPEDWINDOW,
		CW_USEDEFAULT, 0, CW_USEDEFAULT, 0,
		(HWND)NULL, (HMENU)NULL,
		(HINSTANCE)hInstance, NULL);
	
	if (!hMainWnd) 
	{
		MessageBox(NULL, "Cannot create main window", "Error", MB_OK);
		return;
	}
}

Window::Window(WNDCLASSEX w, char* caption, HINSTANCE hInstance)
{
	this->windowStruct = w;
	HWND hMainWnd;  
	char szClassName[] = "Window";
	MSG msg;
	// Регистрируем класс окна
	if (!RegisterClassEx(&(this->windowStruct))) 
	{
		MessageBox(NULL, "Cannot register class", "Error", MB_OK);
		return;
	}
	
	// Создаем основное окно приложения
	hMainWnd = CreateWindow( 
		szClassName, caption, WS_OVERLAPPEDWINDOW,
		CW_USEDEFAULT, 0, CW_USEDEFAULT, 0,
		(HWND)NULL, (HMENU)NULL,
		(HINSTANCE)hInstance, NULL);
	
	if (!hMainWnd) 
	{
		MessageBox(NULL, "Cannot create main window", "Error", MB_OK);
		return;
	}
}

LRESULT CALLBACK Window::WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
	HDC hDC;
	PAINTSTRUCT ps;
	RECT rect;

	switch (msg)
	{
		case WM_CLOSE:
			DestroyWindow(hWnd);
			return 0;
   
		case WM_DESTROY:
			PostQuitMessage(0);
			return 0;

		default:
			return DefWindowProc(hWnd, msg, wParam, lParam);
	}

	return 0;
}

Проблема: компилятор ругается на
this->windowStruct.lpfnWndProc = Window::WndProc;


1 IntelliSense: a value of type "LRESULT (__stdcall Window::*)(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)" cannot be assigned to an entity of type "WNDPROC" c:\documents and settings\dimarik\мои документы\visual studio 2010\projects\blokirator\blokirator \window_components.cpp 13
Dimarik вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Конвертировать формулы из [2007 Word 2007] в [2003 Word 2003] mswmd Microsoft Office Word 8 10.07.2017 17:06
Работать в Word, не открывая документы (работа с закрытыми документами Word) Георгиевич Microsoft Office Word 10 07.09.2009 11:19
Word Maladoj Общие вопросы .NET 5 06.06.2009 09:25
Как вычислять значения вне таблицы WORD, с использованием данных из таблицы WORD prikolist Microsoft Office Word 6 21.11.2008 13:17
Ms Word Farel Общие вопросы Delphi 0 12.01.2008 16:48