Оформеление кода Win32 API
Куда в Win api писать "свой код" в win main функцию или в win proc?
Как я понял win proc работает как обычная функция, следовательно все не статичные переменные в ней инициализируются заново при каждом вызове функции?
Есть у меня класс вопросов и ответов. Пока он работает через консоль, хочу его встроить в обычное окно.(Окно уже сделал)
#define QUESTEST_H
class questest{
private:
static int right;
static int wrong;
static int ansQuest; // отвеченный вопрос.
static int quesLoad; // колличество загруженных вопросов.
static int jumpAns; // номер верного ответа
static int counterAns;
int questNum; // номер вопроса по списку.
int sumAns; //колличество вариантов ответов.
int ranQues;
int ranAnsw;
char bufRus[256]; // массив для перекодировки символов записанный в программе.
std::string ansMass[10];
std::string chooseAns;
std::string correctAns;
std::string ruDosCoder(std::string&);
std::string strLimit(std::string& ,int symbLimit=73);
char* rus(const char* text);
public:
questest(){
right = 0, wrong = 0, ansQuest = 0,quesLoad = 0, questNum = 0;
sumAns = 0,jumpAns = 1071,counterAns = 0;
}
~questest(){
}
void setQuest(std::string quest[]);
void randAsk();
void ask();
void trueAnswers(std::string quest[]);
void choose();
void check();
};
#endif
Зачем нужен указатель на void?
typedef void *HANDLE;
typedef void *HMODULE;
typedef void *HINSTANCE;
typedef void *HKEY;
Что за концепция у Win32 API?
Как я слышал структуры используют как классы, а функции как методы для них?
Куда в Win api писать "свой код" в win main функцию или в win proc?
WinMain - точка входа приложения.
WndProc - callback-функция обработки сообщений (класса) окна.
Зачем нужен указатель на void?
typedef void *HANDLE;
typedef void *HMODULE;
typedef void *HINSTANCE;
typedef void *HKEY;
Смысл использования указателя на void состоит в том, что его размерность равна размерности [дальнего] указателя архитектуры, под которую собран (и под которой, естественно, должен выполняться) PE.
Это, может, и не описано в msdn, но какбы намекает, что дескриптор используется в качестве указателя на некую структуру, хранящую информацию об объекте, которому соответствует дескриптор.
К примеру: HMODULE - указатель (VA) на ячейку памяти, начиная с которой в виртуальное пространство процесса спроецирован целевой модуль.
WinMain - точка входа приложения.
WndProc - callback-функция обработки сообщений (класса) окна.
Смысл использования указателя на void состоит в том, что его размерность равна размерности [дальнего] указателя архитектуры, под которую собран (и под которой, естественно, должен выполняться) PE.
Это, может, и не описано в msdn, но какбы намекает, что дескриптор используется в качестве указателя на некую структуру, хранящую информацию об объекте, которому соответствует дескриптор.
К примеру: HMODULE - указатель (VA) на ячейку памяти, начиная с которой в виртуальное пространство процесса спроецирован целевой модуль.
Я не об этом спрашивал.
В таком случае, что непонятно-то?
"Свой код" писать в обе: и в WinMain и в WndProc но для разных целей, если уж прямо на вопрос отвечать.
А Ваш класс интегрировать в WndProc, разумеется.
"Свой код" писать в обе: и в WinMain и в WndProc но для разных целей, если уж прямо на вопрос отвечать.
Вот я и хочу узнать для каких целей? И как правельно оформлять программу. Как я понял win main используется в основном для инициализации, и получения сообщений?
Спасибо. Попробуем.
Про void* непонятно вопервых зачем, и как.
если мы объявляем указатель на структуру:
strucTest * one;
то мы работаем с данной структурой, а если мы объявляем void * one то с чем мы работаем в этом случае.
Читал что можно использовать указатель void*, но только с приведением его к конкретному типу.
Но не понял не пользы, не удобства.
Можно и так сказать.А в WndProc происходит обработка сообщений(как окну,так и всех остальных из очереди)
если мы объявляем указатель на структуру:
strucTest * one;
то мы работаем с данной структурой, а если мы объявляем void * one то с чем мы работаем в этом случае
void—это «неопределённый» тип.Собственно,как в случае с дескрипторами,все они имеют разную структуру,поэтому описываются просто указателемЕжели б ты,допустим,знал формат структуры HMODULE,можно было б привести тот самый void* к указателю на данную структуру и работать с её полями
То то я и смотрю, что конкретно никто ничего не может объяснить. MFC начал мучать, но там одни "заклинания".
Всем спасибо, всё понял по поводу WinAPI .
Читал что можно использовать указатель void*, но только с приведением его к конкретному типу.
Но не понял не пользы, не удобства.
Ну как же нет пользы? Это унифицированный указатель под неопределённый тип данных.
Тот же malloc() возвращает просто указатель на адрес начала выделенной памяти типа void*.
А там уж через приведение типа работаем с этой памятью как со структурой, массивом, или массивом структур.
Ещё часто бывает нужно, чтобы функция работала с разными структурами. В одном параметре ей передаём указатель типа void*,
а в каком то другом - тип данных (в виде числового идентификатора).
А если понадобится записать структуру в файл, или передать по сети - то, опять же, мы передаём
в функциб адрес (с приведением типа к void*), и указываем размер блока данных.
А уж функция вывода приводит этот адрес к char*, и побайтно обрабатывает данные.
И ей уже всё равно, что там за структура, для неё это просто массив байт.
Да куча подобных задач! И после этого нет пользы? А по поводу удобства... Это скорее вынужденная необходимость,
нежели удобство. :) Хотя и сильно неудобным не назовёшь, если уметь пользоваться.
Проще говоря, void* - это всего лишь адрес в памяти. Обычный адрес. И как с ним работать - зависит от других условий.
Можно даже интерпретировать его и как некий номер (идентификатор).
И мы с этим не работаем. Мы просто передаём функции адрес, а она сама решает, что с ним делать.
Или приводим к нужному нам типу (если пишем подобную функцию), и уже с ним работаем.