Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Оформеление кода Win32 API

21K
02 декабря 2011 года
Apprentice2
25 / / 02.01.2010
Здравствуйте, есть такой вопрос:
Куда в Win api писать "свой код" в win main функцию или в win proc?

Как я понял win proc работает как обычная функция, следовательно все не статичные переменные в ней инициализируются заново при каждом вызове функции?

Есть у меня класс вопросов и ответов. Пока он работает через консоль, хочу его встроить в обычное окно.(Окно уже сделал)

Код:
#ifndef QUESTEST_H
#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?
Как я слышал структуры используют как классы, а функции как методы для них?
16K
02 декабря 2011 года
asmforce
186 / / 05.01.2010
Цитата: Apprentice2

Куда в Win api писать "свой код" в win main функцию или в win proc?



WinMain - точка входа приложения.
WndProc - callback-функция обработки сообщений (класса) окна.

Цитата: Apprentice2

Зачем нужен указатель на void?
typedef void *HANDLE;
typedef void *HMODULE;
typedef void *HINSTANCE;
typedef void *HKEY;



Смысл использования указателя на void состоит в том, что его размерность равна размерности [дальнего] указателя архитектуры, под которую собран (и под которой, естественно, должен выполняться) PE.

Это, может, и не описано в msdn, но какбы намекает, что дескриптор используется в качестве указателя на некую структуру, хранящую информацию об объекте, которому соответствует дескриптор.
К примеру: HMODULE - указатель (VA) на ячейку памяти, начиная с которой в виртуальное пространство процесса спроецирован целевой модуль.

21K
02 декабря 2011 года
Apprentice2
25 / / 02.01.2010
Цитата: asmforce

WinMain - точка входа приложения.
WndProc - callback-функция обработки сообщений (класса) окна.



Цитата: asmforce

Смысл использования указателя на void состоит в том, что его размерность равна размерности [дальнего] указателя архитектуры, под которую собран (и под которой, естественно, должен выполняться) PE.

Это, может, и не описано в msdn, но какбы намекает, что дескриптор используется в качестве указателя на некую структуру, хранящую информацию об объекте, которому соответствует дескриптор.
К примеру: HMODULE - указатель (VA) на ячейку памяти, начиная с которой в виртуальное пространство процесса спроецирован целевой модуль.


Я не об этом спрашивал.

16K
02 декабря 2011 года
asmforce
186 / / 05.01.2010
Цитата: Apprentice2
Я не об этом спрашивал.



В таком случае, что непонятно-то?
"Свой код" писать в обе: и в WinMain и в WndProc но для разных целей, если уж прямо на вопрос отвечать.
А Ваш класс интегрировать в WndProc, разумеется.

21K
03 декабря 2011 года
Apprentice2
25 / / 02.01.2010
Цитата:
В таком случае, что непонятно-то?
"Свой код" писать в обе: и в WinMain и в WndProc но для разных целей, если уж прямо на вопрос отвечать.


Вот я и хочу узнать для каких целей? И как правельно оформлять программу. Как я понял win main используется в основном для инициализации, и получения сообщений?

Цитата:
А Ваш класс интегрировать в WndProc, разумеется.


Спасибо. Попробуем.

Про void* непонятно вопервых зачем, и как.
если мы объявляем указатель на структуру:
strucTest * one;
то мы работаем с данной структурой, а если мы объявляем void * one то с чем мы работаем в этом случае.
Читал что можно использовать указатель void*, но только с приведением его к конкретному типу.
Но не понял не пользы, не удобства.

7
03 декабря 2011 года
@pixo $oft
3.4K / / 20.09.2006
Цитата: Apprentice2
Вот я и хочу узнать для каких целей? И как правельно оформлять программу. Как я понял win main используется в основном для инициализации, и получения сообщений?

Можно и так сказать.А в WndProc происходит обработка сообщений(как окну,так и всех остальных из очереди)

Цитата: Apprentice2
Про void* непонятно вопервых зачем, и как.
если мы объявляем указатель на структуру:
strucTest * one;
то мы работаем с данной структурой, а если мы объявляем void * one то с чем мы работаем в этом случае

void—это «неопределённый» тип.Собственно,как в случае с дескрипторами,все они имеют разную структуру,поэтому описываются просто указателемЕжели б ты,допустим,знал формат структуры HMODULE,можно было б привести тот самый void* к указателю на данную структуру и работать с её полями

278
03 декабря 2011 года
Alexander92
1.1K / / 04.08.2008
А еще, ежели хотите работать с классами, то WinAPI - откровенно не самый удачный выбор. Берите уже тогда MFC или Qt.
21K
03 декабря 2011 года
Apprentice2
25 / / 02.01.2010
Цитата:
А еще, ежели хотите работать с классами, то WinAPI - откровенно не самый удачный выбор. Берите уже тогда MFC или Qt.


То то я и смотрю, что конкретно никто ничего не может объяснить. MFC начал мучать, но там одни "заклинания".
Всем спасибо, всё понял по поводу WinAPI .

41K
03 декабря 2011 года
kisssko
108 / / 28.10.2010
Цитата: Apprentice2
то мы работаем с данной структурой, а если мы объявляем void * one то с чем мы работаем в этом случае.
Читал что можно использовать указатель void*, но только с приведением его к конкретному типу.
Но не понял не пользы, не удобства.



Ну как же нет пользы? Это унифицированный указатель под неопределённый тип данных.
Тот же malloc() возвращает просто указатель на адрес начала выделенной памяти типа void*.
А там уж через приведение типа работаем с этой памятью как со структурой, массивом, или массивом структур.
Ещё часто бывает нужно, чтобы функция работала с разными структурами. В одном параметре ей передаём указатель типа void*,
а в каком то другом - тип данных (в виде числового идентификатора).
А если понадобится записать структуру в файл, или передать по сети - то, опять же, мы передаём
в функциб адрес (с приведением типа к void*), и указываем размер блока данных.
А уж функция вывода приводит этот адрес к char*, и побайтно обрабатывает данные.
И ей уже всё равно, что там за структура, для неё это просто массив байт.
Да куча подобных задач! И после этого нет пользы? А по поводу удобства... Это скорее вынужденная необходимость,
нежели удобство. :) Хотя и сильно неудобным не назовёшь, если уметь пользоваться.

Цитата:
а если мы объявляем void * one то с чем мы работаем в этом случае.


Проще говоря, void* - это всего лишь адрес в памяти. Обычный адрес. И как с ним работать - зависит от других условий.
Можно даже интерпретировать его и как некий номер (идентификатор).
И мы с этим не работаем. Мы просто передаём функции адрес, а она сама решает, что с ним делать.
Или приводим к нужному нам типу (если пишем подобную функцию), и уже с ним работаем.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог