<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>https://wiki.shelek.ru/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Mczim</id>
		<title>Весельчак У - Вклад участника [ru]</title>
		<link rel="self" type="application/atom+xml" href="https://wiki.shelek.ru/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Mczim"/>
		<link rel="alternate" type="text/html" href="https://wiki.shelek.ru/index.php/%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/Mczim"/>
		<updated>2026-05-07T03:36:16Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.25.1</generator>

	<entry>
		<id>https://wiki.shelek.ru/index.php?title=FAQ:Oracle:create_pfile_form_spfile&amp;diff=883</id>
		<title>FAQ:Oracle:create pfile form spfile</title>
		<link rel="alternate" type="text/html" href="https://wiki.shelek.ru/index.php?title=FAQ:Oracle:create_pfile_form_spfile&amp;diff=883"/>
				<updated>2010-01-12T14:13:52Z</updated>
		
		<summary type="html">&lt;p&gt;Mczim: Новая: SID - название экземпляра базы.  &amp;lt;code sql&amp;gt; SQL&amp;gt; create pfile='/path/to/file/initSID.ora' from spfile='/path/to/file/spfileSID.ora' &amp;lt;/code&amp;gt;  Проверим как...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;SID - название экземпляра базы.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SQL&amp;gt; create pfile='/path/to/file/initSID.ora' from spfile='/path/to/file/spfileSID.ora'&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Проверим как экземпляр запуститься с этим конфигурационным файлом.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SQL&amp;gt; startup pfile='/path/to/file/initSID.ora'&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Так же параметры в spfile можно изменять с помощью: '''ALTER SYSTEM SET''', например:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SQL&amp;gt; ALTER SYSTEM SET db_files = 5000 scope=spfile;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
изменения вступят в силу после перезагрузки.&lt;br /&gt;
&lt;br /&gt;
Все действующие параметры можно посмотреть в представлении '''V$PARAMETER'''&lt;/div&gt;</summary>
		<author><name>Mczim</name></author>	</entry>

	<entry>
		<id>https://wiki.shelek.ru/index.php?title=FAQ:Oracle&amp;diff=882</id>
		<title>FAQ:Oracle</title>
		<link rel="alternate" type="text/html" href="https://wiki.shelek.ru/index.php?title=FAQ:Oracle&amp;diff=882"/>
				<updated>2010-01-12T14:05:54Z</updated>
		
		<summary type="html">&lt;p&gt;Mczim: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
#[[FAQ:Oracle:Как перевести БД из режима noarchivelog в archivelog|Как перевести БД из режима noarchivelog в archivelog.]]&lt;br /&gt;
#[[FAQ:Oracle:archivelog or noarchivelog|Как узнать режим работы базы archivelog или noarchivelog.]]&lt;br /&gt;
#[[FAQ:Oracle:изменить пароль|Как изменить пароль у пользователя.]]&lt;br /&gt;
#[[FAQ:Oracle:изменить кодировку|Как изменить кодировку у БД.]]&lt;br /&gt;
#[[FAQ:Oracle:create pfile form spfile|Как создать pfile из spfile.]]&lt;/div&gt;</summary>
		<author><name>Mczim</name></author>	</entry>

	<entry>
		<id>https://wiki.shelek.ru/index.php?title=FAQ:Oracle:%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B8%D1%82%D1%8C_%D0%BA%D0%BE%D0%B4%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D1%83&amp;diff=881</id>
		<title>FAQ:Oracle:изменить кодировку</title>
		<link rel="alternate" type="text/html" href="https://wiki.shelek.ru/index.php?title=FAQ:Oracle:%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B8%D1%82%D1%8C_%D0%BA%D0%BE%D0%B4%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D1%83&amp;diff=881"/>
				<updated>2010-01-12T14:02:35Z</updated>
		
		<summary type="html">&lt;p&gt;Mczim: Новая: Предположим Вы хотите установить кодировку '''AL32UTF8'''.  Нужно узнать, присутствует ли необходимая вам к...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Предположим Вы хотите установить кодировку '''AL32UTF8'''.&lt;br /&gt;
&lt;br /&gt;
Нужно узнать, присутствует ли необходимая вам кодировка в списке допустимых:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SQL&amp;gt; select value from V$NLS_VALID_VALUES&lt;br /&gt;
          where parameter='CHARACTERSET'&lt;br /&gt;
          and value like 'AL%'&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Допустим Вы имеете '''WE8ISO8859P1''', и хотите изменить ее на '''AL32UTF8'''.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SQL&amp;gt; select * from props$ where name='NLS_CHARACTERSET';&lt;br /&gt;
&lt;br /&gt;
NLS_CHARACTERSET &lt;br /&gt;
----------------&lt;br /&gt;
WE8ISO8859P1    &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
для это обновляем таблицу, на необходимую кодировку&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SQL&amp;gt; update props$ set VALUE$='AL32UTF8' where name='NLS_CHARACTERSET';&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''PROPS$''' - это fixed table, где хранится информация об NLS и не только. Несмотря на термин fixed многие версии Oracle позволяют производить UPDATE над ней (хотя не все - какие-то версии Personal Oracle не допускают этого).&lt;/div&gt;</summary>
		<author><name>Mczim</name></author>	</entry>

	<entry>
		<id>https://wiki.shelek.ru/index.php?title=FAQ:Oracle&amp;diff=880</id>
		<title>FAQ:Oracle</title>
		<link rel="alternate" type="text/html" href="https://wiki.shelek.ru/index.php?title=FAQ:Oracle&amp;diff=880"/>
				<updated>2010-01-12T13:54:21Z</updated>
		
		<summary type="html">&lt;p&gt;Mczim: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
#[[FAQ:Oracle:Как перевести БД из режима noarchivelog в archivelog|Как перевести БД из режима noarchivelog в archivelog.]]&lt;br /&gt;
#[[FAQ:Oracle:archivelog or noarchivelog|Как узнать режим работы базы archivelog или noarchivelog.]]&lt;br /&gt;
#[[FAQ:Oracle:изменить пароль|Как изменить пароль у пользователя.]]&lt;br /&gt;
#[[FAQ:Oracle:изменить кодировку|Как изменить кодировку у БД.]]&lt;/div&gt;</summary>
		<author><name>Mczim</name></author>	</entry>

	<entry>
		<id>https://wiki.shelek.ru/index.php?title=FAQ:Oracle:%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B8%D1%82%D1%8C_%D0%BF%D0%B0%D1%80%D0%BE%D0%BB%D1%8C&amp;diff=879</id>
		<title>FAQ:Oracle:изменить пароль</title>
		<link rel="alternate" type="text/html" href="https://wiki.shelek.ru/index.php?title=FAQ:Oracle:%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B8%D1%82%D1%8C_%D0%BF%D0%B0%D1%80%D0%BE%D0%BB%D1%8C&amp;diff=879"/>
				<updated>2010-01-12T13:51:24Z</updated>
		
		<summary type="html">&lt;p&gt;Mczim: Новая: &amp;lt;code sql&amp;gt; SQL&amp;gt; ALTER USER some_user IDENTIFIED BY some_pass; &amp;lt;/code&amp;gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SQL&amp;gt; ALTER USER some_user IDENTIFIED BY some_pass;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mczim</name></author>	</entry>

	<entry>
		<id>https://wiki.shelek.ru/index.php?title=FAQ:Oracle&amp;diff=878</id>
		<title>FAQ:Oracle</title>
		<link rel="alternate" type="text/html" href="https://wiki.shelek.ru/index.php?title=FAQ:Oracle&amp;diff=878"/>
				<updated>2010-01-12T13:50:28Z</updated>
		
		<summary type="html">&lt;p&gt;Mczim: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
#[[FAQ:Oracle:Как перевести БД из режима noarchivelog в archivelog|Как перевести БД из режима noarchivelog в archivelog.]]&lt;br /&gt;
#[[FAQ:Oracle:archivelog or noarchivelog|Как узнать режим работы базы archivelog или noarchivelog.]]&lt;br /&gt;
#[[FAQ:Oracle:изменить пароль|Как изменить пароль у пользователя.]]&lt;/div&gt;</summary>
		<author><name>Mczim</name></author>	</entry>

	<entry>
		<id>https://wiki.shelek.ru/index.php?title=FAQ:Oracle:archivelog_or_noarchivelog&amp;diff=877</id>
		<title>FAQ:Oracle:archivelog or noarchivelog</title>
		<link rel="alternate" type="text/html" href="https://wiki.shelek.ru/index.php?title=FAQ:Oracle:archivelog_or_noarchivelog&amp;diff=877"/>
				<updated>2010-01-12T13:48:38Z</updated>
		
		<summary type="html">&lt;p&gt;Mczim: Новая: &amp;lt;code sql&amp;gt; SQL&amp;gt; select log_mode from v$database; &amp;lt;/code&amp;gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SQL&amp;gt; select log_mode from v$database;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mczim</name></author>	</entry>

	<entry>
		<id>https://wiki.shelek.ru/index.php?title=FAQ:Oracle&amp;diff=876</id>
		<title>FAQ:Oracle</title>
		<link rel="alternate" type="text/html" href="https://wiki.shelek.ru/index.php?title=FAQ:Oracle&amp;diff=876"/>
				<updated>2010-01-12T13:47:52Z</updated>
		
		<summary type="html">&lt;p&gt;Mczim: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
#[[FAQ:Oracle:Как перевести БД из режима noarchivelog в archivelog|Как перевести БД из режима noarchivelog в archivelog.]]&lt;br /&gt;
#[[FAQ:Oracle:archivelog or noarchivelog|Как узнать режим работы базы archivelog или noarchivelog.]]&lt;/div&gt;</summary>
		<author><name>Mczim</name></author>	</entry>

	<entry>
		<id>https://wiki.shelek.ru/index.php?title=FAQ:Oracle:%D0%9A%D0%B0%D0%BA_%D0%BF%D0%B5%D1%80%D0%B5%D0%B2%D0%B5%D1%81%D1%82%D0%B8_%D0%91%D0%94_%D0%B8%D0%B7_%D1%80%D0%B5%D0%B6%D0%B8%D0%BC%D0%B0_noarchivelog_%D0%B2_archivelog&amp;diff=875</id>
		<title>FAQ:Oracle:Как перевести БД из режима noarchivelog в archivelog</title>
		<link rel="alternate" type="text/html" href="https://wiki.shelek.ru/index.php?title=FAQ:Oracle:%D0%9A%D0%B0%D0%BA_%D0%BF%D0%B5%D1%80%D0%B5%D0%B2%D0%B5%D1%81%D1%82%D0%B8_%D0%91%D0%94_%D0%B8%D0%B7_%D1%80%D0%B5%D0%B6%D0%B8%D0%BC%D0%B0_noarchivelog_%D0%B2_archivelog&amp;diff=875"/>
				<updated>2010-01-12T13:37:41Z</updated>
		
		<summary type="html">&lt;p&gt;Mczim: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Сначала сделаем изменения параметра в файле инициализации log_archive_dest_1:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SQL&amp;gt; alter system set log_archive_dest_1='/02/arch';&lt;br /&gt;
System altered.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Затем остановим базу данных и смонтируем. Открывать не нужно.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SQL&amp;gt; SHUTDOWN IMMEDIATE&lt;br /&gt;
Database closed.&lt;br /&gt;
Database dismounted.&lt;br /&gt;
ORACLE instance shut down.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SQL&amp;gt; STARTUP MOUNT&lt;br /&gt;
ORACLE instance started.&lt;br /&gt;
Total System Global Area  135863156 bytes&lt;br /&gt;
Fixed Size                   453492 bytes&lt;br /&gt;
Variable Size             109051904 bytes&lt;br /&gt;
Database Buffers           25165824 bytes&lt;br /&gt;
Redo Buffers                1191936 bytes&lt;br /&gt;
Database mounted.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Переведем базу данных в режим архивирования журналов.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SQL&amp;gt; ALTER DATABASE ARCHIVELOG;&lt;br /&gt;
Database altered.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Стартуем архивацию&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SQL&amp;gt; ARCHIVE LOG START;&lt;br /&gt;
Statement processed.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Теперь откроем базу данных&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SQL&amp;gt; ALTER DATABASE OPEN;&lt;br /&gt;
Database altered.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Проверим работу базы данных ORACLE в режиме ARCHIVELOG элементарным способом. Переключим журнальные файлы несколько раз:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SQL&amp;gt; ALTER SYSTEM SWITCH LOGFILE;&lt;br /&gt;
System altered.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SQL&amp;gt; /&lt;br /&gt;
System altered.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SQL&amp;gt; /&lt;br /&gt;
System altered.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SQL&amp;gt; /&lt;br /&gt;
System altered.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В директории '/02/arch', которую мы определили выше, появятся файлы архивных журналов.&lt;/div&gt;</summary>
		<author><name>Mczim</name></author>	</entry>

	<entry>
		<id>https://wiki.shelek.ru/index.php?title=FAQ:Oracle:%D0%9A%D0%B0%D0%BA_%D0%BF%D0%B5%D1%80%D0%B5%D0%B2%D0%B5%D1%81%D1%82%D0%B8_%D0%91%D0%94_%D0%B8%D0%B7_%D1%80%D0%B5%D0%B6%D0%B8%D0%BC%D0%B0_noarchivelog_%D0%B2_archivelog&amp;diff=874</id>
		<title>FAQ:Oracle:Как перевести БД из режима noarchivelog в archivelog</title>
		<link rel="alternate" type="text/html" href="https://wiki.shelek.ru/index.php?title=FAQ:Oracle:%D0%9A%D0%B0%D0%BA_%D0%BF%D0%B5%D1%80%D0%B5%D0%B2%D0%B5%D1%81%D1%82%D0%B8_%D0%91%D0%94_%D0%B8%D0%B7_%D1%80%D0%B5%D0%B6%D0%B8%D0%BC%D0%B0_noarchivelog_%D0%B2_archivelog&amp;diff=874"/>
				<updated>2010-01-12T13:32:41Z</updated>
		
		<summary type="html">&lt;p&gt;Mczim: Новая: Сначала сделаем изменения параметра в файле инициализации log_archive_dest_1:  '''SQL&amp;gt; alter system set log_archive_dest_1='/02/arch';'...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Сначала сделаем изменения параметра в файле инициализации log_archive_dest_1:&lt;br /&gt;
&lt;br /&gt;
'''SQL&amp;gt; alter system set log_archive_dest_1='/02/arch';'''&lt;br /&gt;
System altered.&lt;br /&gt;
&lt;br /&gt;
Затем остановим базу данных и смонтируем. Открывать не нужно.&lt;br /&gt;
&lt;br /&gt;
'''SQL&amp;gt; SHUTDOWN IMMEDIATE'''&lt;br /&gt;
Database closed.&lt;br /&gt;
Database dismounted.&lt;br /&gt;
ORACLE instance shut down.&lt;br /&gt;
&lt;br /&gt;
'''SQL&amp;gt; STARTUP MOUNT'''&lt;br /&gt;
ORACLE instance started.&lt;br /&gt;
Total System Global Area  135863156 bytes&lt;br /&gt;
Fixed Size                   453492 bytes&lt;br /&gt;
Variable Size             109051904 bytes&lt;br /&gt;
Database Buffers           25165824 bytes&lt;br /&gt;
Redo Buffers                1191936 bytes&lt;br /&gt;
Database mounted.&lt;br /&gt;
&lt;br /&gt;
Переведем базу данных в режим архивирования журналов.&lt;br /&gt;
&lt;br /&gt;
'''SQL&amp;gt; ALTER DATABASE ARCHIVELOG;'''&lt;br /&gt;
Database altered.&lt;br /&gt;
&lt;br /&gt;
Стартуем архивацию&lt;br /&gt;
&lt;br /&gt;
'''SQL&amp;gt; ARCHIVE LOG START;'''&lt;br /&gt;
Statement processed.&lt;br /&gt;
&lt;br /&gt;
Теперь откроем базу данных&lt;br /&gt;
&lt;br /&gt;
'''SQL&amp;gt; ALTER DATABASE OPEN;'''&lt;br /&gt;
Database altered.&lt;br /&gt;
&lt;br /&gt;
Проверим работу базы данных ORACLE в режиме ARCHIVELOG элементарным способом. Переключим журнальные файлы несколько раз:&lt;br /&gt;
&lt;br /&gt;
'''SQL&amp;gt; ALTER SYSTEM SWITCH LOGFILE;'''&lt;br /&gt;
System altered.&lt;br /&gt;
'''SQL&amp;gt; /'''&lt;br /&gt;
System altered.&lt;br /&gt;
'''SQL&amp;gt; /'''&lt;br /&gt;
System altered.&lt;br /&gt;
'''SQL&amp;gt; /'''&lt;br /&gt;
System altered.&lt;br /&gt;
&lt;br /&gt;
В директории '/02/arch', которую мы определили выше, появятся файлы архивных журналов.&lt;/div&gt;</summary>
		<author><name>Mczim</name></author>	</entry>

	<entry>
		<id>https://wiki.shelek.ru/index.php?title=FAQ:Oracle&amp;diff=873</id>
		<title>FAQ:Oracle</title>
		<link rel="alternate" type="text/html" href="https://wiki.shelek.ru/index.php?title=FAQ:Oracle&amp;diff=873"/>
				<updated>2010-01-12T13:29:10Z</updated>
		
		<summary type="html">&lt;p&gt;Mczim: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
#[[FAQ:Oracle:Как перевести БД из режима noarchivelog в archivelog|Как перевести БД из режима noarchivelog в archivelog.]]&lt;/div&gt;</summary>
		<author><name>Mczim</name></author>	</entry>

	<entry>
		<id>https://wiki.shelek.ru/index.php?title=FAQ:Oracle&amp;diff=872</id>
		<title>FAQ:Oracle</title>
		<link rel="alternate" type="text/html" href="https://wiki.shelek.ru/index.php?title=FAQ:Oracle&amp;diff=872"/>
				<updated>2010-01-12T13:28:25Z</updated>
		
		<summary type="html">&lt;p&gt;Mczim: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
#[[FAQ:Oracle:сравнить два числа типа double|Не получается сравнить два числа типа double.]]&lt;br /&gt;
&lt;br /&gt;
|Как перевести БД из режима noarchivelog в archivelog.&lt;/div&gt;</summary>
		<author><name>Mczim</name></author>	</entry>

	<entry>
		<id>https://wiki.shelek.ru/index.php?title=FAQ:Oracle&amp;diff=871</id>
		<title>FAQ:Oracle</title>
		<link rel="alternate" type="text/html" href="https://wiki.shelek.ru/index.php?title=FAQ:Oracle&amp;diff=871"/>
				<updated>2010-01-12T13:26:10Z</updated>
		
		<summary type="html">&lt;p&gt;Mczim: Новая: |Как перевести БД из режима noarchivelog в archivelog.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;|Как перевести БД из режима noarchivelog в archivelog.&lt;/div&gt;</summary>
		<author><name>Mczim</name></author>	</entry>

	<entry>
		<id>https://wiki.shelek.ru/index.php?title=%D0%97%D0%B0%D0%B3%D0%BB%D0%B0%D0%B2%D0%BD%D0%B0%D1%8F_%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D0%B0&amp;diff=870</id>
		<title>Заглавная страница</title>
		<link rel="alternate" type="text/html" href="https://wiki.shelek.ru/index.php?title=%D0%97%D0%B0%D0%B3%D0%BB%D0%B0%D0%B2%D0%BD%D0%B0%D1%8F_%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D0%B0&amp;diff=870"/>
				<updated>2010-01-12T13:24:13Z</updated>
		
		<summary type="html">&lt;p&gt;Mczim: /* Основной материал. */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
=Википедия Клуба программистов &amp;quot;Весельчак У&amp;quot;=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Разделы==&lt;br /&gt;
&lt;br /&gt;
===Основной материал.===&lt;br /&gt;
* [[FAQ:Содержание|Ответы на часто задаваемые вопросы о программировании]]. Составлено по темам [[Форум программистов|нашего форума]].&lt;br /&gt;
* [[FAQ:Oracle|Ответы на часто задаваемые вопросы по Oracle]].&lt;br /&gt;
&lt;br /&gt;
===Дополнительный материал.===&lt;br /&gt;
* [[Английский язык|Правила английского языка]].&lt;br /&gt;
* [[Глобальная авантюра|Глобальная авантюра]]. Материалы о мировом экономическом кризисе.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''!''' Чтобы быстрее найти необходимый материал, воспользуйтесь строкой поиска в левой колонке страницы.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Вы можете принять участие в подготовке материалов для сайта на нашем форуме в [http://forum.shelek.ru/index.php/board,114.0.html разделе ЧАВО].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Портал]]&lt;/div&gt;</summary>
		<author><name>Mczim</name></author>	</entry>

	<entry>
		<id>https://wiki.shelek.ru/index.php?title=%D0%97%D0%B0%D0%B3%D0%BB%D0%B0%D0%B2%D0%BD%D0%B0%D1%8F_%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D0%B0&amp;diff=869</id>
		<title>Заглавная страница</title>
		<link rel="alternate" type="text/html" href="https://wiki.shelek.ru/index.php?title=%D0%97%D0%B0%D0%B3%D0%BB%D0%B0%D0%B2%D0%BD%D0%B0%D1%8F_%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D0%B0&amp;diff=869"/>
				<updated>2010-01-12T13:21:46Z</updated>
		
		<summary type="html">&lt;p&gt;Mczim: /* Основной материал. */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
=Википедия Клуба программистов &amp;quot;Весельчак У&amp;quot;=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Разделы==&lt;br /&gt;
&lt;br /&gt;
===Основной материал.===&lt;br /&gt;
* [[FAQ:Содержание|Ответы на часто задаваемые вопросы о программировании]]. Составлено по темам [[Форум программистов|нашего форума]].&lt;br /&gt;
* [[FAQ:Содержание|Ответы на часто задаваемые вопросы по Oracle]].&lt;br /&gt;
&lt;br /&gt;
===Дополнительный материал.===&lt;br /&gt;
* [[Английский язык|Правила английского языка]].&lt;br /&gt;
* [[Глобальная авантюра|Глобальная авантюра]]. Материалы о мировом экономическом кризисе.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''!''' Чтобы быстрее найти необходимый материал, воспользуйтесь строкой поиска в левой колонке страницы.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Вы можете принять участие в подготовке материалов для сайта на нашем форуме в [http://forum.shelek.ru/index.php/board,114.0.html разделе ЧАВО].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Портал]]&lt;/div&gt;</summary>
		<author><name>Mczim</name></author>	</entry>

	<entry>
		<id>https://wiki.shelek.ru/index.php?title=FAQ:STL:C%2B%2B_%D1%81%D0%B5%D1%80%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85&amp;diff=458</id>
		<title>FAQ:STL:C++ сериализация данных</title>
		<link rel="alternate" type="text/html" href="https://wiki.shelek.ru/index.php?title=FAQ:STL:C%2B%2B_%D1%81%D0%B5%D1%80%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85&amp;diff=458"/>
				<updated>2008-09-30T07:35:05Z</updated>
		
		<summary type="html">&lt;p&gt;Mczim: // вывести состояние классы &amp;gt;&amp;gt; // вывести состояние класса. велосипед &amp;gt;&amp;gt; &amp;quot;велосипед&amp;quot;. Кое где поставил запятые. Исправлены опечатки.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Иногда нужно сохранить состояние класса в файл, передать состояние класса по сети. Подобные задачи обычно решает сериализация. &lt;br /&gt;
&lt;br /&gt;
Говоря о сериализации, я подразумиваю механизмы перевода некоторого класса, структуры или набора переменных в определённый формат (бинарный, текстовый, XML, HTML и т.д.), а так же сам процесс перевода. Десериализация - процессы и механизмы обратные сериализации (восстановление состояния из внешнего источника). &lt;br /&gt;
&lt;br /&gt;
Самый простой способ, к которому чаще всего прибегают молодые программисты - это простое копирование памяти в файл или еще куда-то. Т.е. берём указатель на класс/структуру/переменную и копируем N байт в файл. Пример: &amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
.......&lt;br /&gt;
MyClass m;&lt;br /&gt;
..............&lt;br /&gt;
std::ofstream f(&amp;quot;dump.bin&amp;quot;, std::binary);&lt;br /&gt;
f.write(&amp;amp;m, sizeof(m));&lt;br /&gt;
f.close();&lt;br /&gt;
........................&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Но этот метод сериализации имеет ряд ограничений и недостатков: &lt;br /&gt;
&lt;br /&gt;
*Допустимо использовать только для POD-структур (POD - Plain Old Data) и встроенных типов. Почему будет понятно из следующих пунктов. &lt;br /&gt;
*Если, программистом описан конструктор, то компилятор в праве в класс добавить какие-то свои вспомогательные переменные, что превращает класс в не POD-структуру, на самом деле это не так страшно, но формально это так. &lt;br /&gt;
*При сохранении указателей членов класса, будут скопированы, только адреса хранимые указателями и естественно класс с указателями это не POD-тип &lt;br /&gt;
*Если в классе объявленные виртуальные функции (или он унаследован от класса содержащего виртуальные функции), приводит к тому, что класс будет дополнен указателем на таблицу виртуальных функций, и с этим указателем, таже проблема, что и со всеми другими. Опять же не POD-тип. &lt;br /&gt;
*Если ваш класс содержит внутри себя не POD типы или унаследован от не POD-типа, то ваш класс тоже не под тип, т.е. нет никакой гарантии, что копирование куска памяти позволит постановить состояние класса. &lt;br /&gt;
*Различное выравнивание данных внутри класса может сделать не возможным перенос сохранённого класса на другую платформу или даже в программу скомпилированную с другими параметрами компиляции. &lt;br /&gt;
*Различный порядок байт не позволит переносить данные между такими платформами, как: x86 и PowerPC &lt;br /&gt;
*И такая сериализация не даёт сохранить в удобочитаемой форме: XML, текст или CSV&lt;br /&gt;
&lt;br /&gt;
Есть куча ситуация, когда создание дампа памяти вполне допустимый метод сериализации, но так же, есть другая куча ситуаций когда такой подход не допустим. &lt;br /&gt;
&lt;br /&gt;
Как только программист задумывается о сериализации данных, ему сразу же хочется выполнять сериализацию всего парой строк кода: легко и изящно, например, так: &amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
// вывести состояние класса и всех его членов.&lt;br /&gt;
std::cout &amp;lt;&amp;lt; myClass;&lt;br /&gt;
&lt;br /&gt;
// загрузить состояние класса из XML&lt;br /&gt;
myXML &amp;gt;&amp;gt; myClass; &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
И естественно самый простой способ быстро добиться результата это использовать &amp;quot;велосипед&amp;quot; написанный другими. &amp;quot;Велосипед&amp;quot; возьмём хороший много функциональный. Он умеет выполнять сериализацию и десериализацию: стандартных контейнеров, классов, указателей, ссылок и еще чего-то. Также он умеет сохранять, работать с различными форматами выходных данных: бинарный, текст, XML. Если очень хочется, то он может сохранить не только в поток, но и куда угодно, например, в вектор или в сокет или выкинуть в пропасть.&lt;br /&gt;
&lt;br /&gt;
Полное описание &amp;quot;велосипеда&amp;quot;: http://www.boost.org/doc/libs/1_36_0/libs/serialization/doc/index.html &lt;br /&gt;
&lt;br /&gt;
Вот пример использования (взято из описания): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
/////////////////////////////////////////////////////////////&lt;br /&gt;
// gps координаты&lt;br /&gt;
//&lt;br /&gt;
// illustrates serialization for a simple type&lt;br /&gt;
//&lt;br /&gt;
class gps_position&lt;br /&gt;
{&lt;br /&gt;
private:&lt;br /&gt;
    friend class boost::serialization::access;&lt;br /&gt;
    // When the class Archive corresponds to an output archive, the&lt;br /&gt;
    // &amp;amp; operator is defined similar to &amp;lt;&amp;lt;.  Likewise, when the class Archive&lt;br /&gt;
    // is a type of input archive the &amp;amp; operator is defined similar to &amp;gt;&amp;gt;.&lt;br /&gt;
    template&amp;lt;class Archive&amp;gt;&lt;br /&gt;
    void serialize(Archive &amp;amp; ar, const unsigned int version)&lt;br /&gt;
    {&lt;br /&gt;
        ar &amp;amp; degrees;&lt;br /&gt;
        ar &amp;amp; minutes;&lt;br /&gt;
        ar &amp;amp; seconds;&lt;br /&gt;
    }&lt;br /&gt;
    int degrees;&lt;br /&gt;
    int minutes;&lt;br /&gt;
    float seconds;&lt;br /&gt;
public:&lt;br /&gt;
    gps_position(){};&lt;br /&gt;
    gps_position(int d, int m, float s) :&lt;br /&gt;
        degrees(d), minutes(m), seconds(s)&lt;br /&gt;
    {}&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    // create and open a character archive for output&lt;br /&gt;
    std::ofstream ofs(&amp;quot;filename&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    // create class instance&lt;br /&gt;
    const gps_position g(35, 59, 24.567f);&lt;br /&gt;
&lt;br /&gt;
    // save data to archive&lt;br /&gt;
    {&lt;br /&gt;
        boost::archive::text_oarchive oa(ofs);&lt;br /&gt;
        // write class instance to archive&lt;br /&gt;
        oa &amp;lt;&amp;lt; g;&lt;br /&gt;
    	// archive and stream closed when destructors are called&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // ... some time later restore the class instance to its orginal state&lt;br /&gt;
    gps_position newg;&lt;br /&gt;
    {&lt;br /&gt;
        // create and open an archive for input&lt;br /&gt;
        std::ifstream ifs(&amp;quot;filename&amp;quot;);&lt;br /&gt;
        boost::archive::text_iarchive ia(ifs);&lt;br /&gt;
        // read class state from archive&lt;br /&gt;
        ia &amp;gt;&amp;gt; newg;&lt;br /&gt;
        // archive and stream closed when destructors are called&lt;br /&gt;
    }&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Теперь по пунктам как это работает: &lt;br /&gt;
&lt;br /&gt;
#Создаём внутри нашего класса метод serialize, получаем ссылку на архив и номер версии(можно по разному сериализовать в зависимости от версии), если метод приватный, то добавляем в друзья class boost::serialization::access. Метод serialize будет вызываться при сериализации и десериализации.&lt;br /&gt;
#Открываем файл и создаём архив (text_oarchive текстовый выходной архив), в нашем случае текстовый - архив это тот самый класс который выполняет основную работу.&lt;br /&gt;
#Вызываем всеми любимый оператор &amp;amp;lt;&amp;amp;lt; - этот оператор вызывает метод serialize для классов или же внешние функции(они идут в комплекте) для встроенных типов и стандартных контейнеров.&lt;br /&gt;
#text_oarchive::operator&amp;amp;lt;&amp;amp;lt; вызвал наш метод serialize и передал во внутрь себя, тут возникает вопрос: почему внутри serialize используется оператор &amp;amp;amp;, а не &amp;amp;lt;&amp;amp;lt;? Ответ: потому что, у выходного архива операторы &amp;amp;amp; и &amp;amp;lt;&amp;amp;lt; по сути это одно и тоже, у входного операторы &amp;amp;amp; и &amp;amp;gt;&amp;amp;gt; одно и тоже. Т.е. ничто не мешает в коде поменять &amp;quot;ia &amp;amp;gt;&amp;amp;gt; newg;&amp;quot; на &amp;quot;ia &amp;amp;amp; newg;&amp;quot;.&lt;br /&gt;
#Если нужно изменить метод сериализации, достаточно поменять тип архива (для XML архива придётся сделать еще некоторою работу в методе serialize).&lt;br /&gt;
&lt;br /&gt;
На это, в общем то работа по поддержке сериализации закончена.&lt;br /&gt;
&lt;br /&gt;
При желании, можно разделить методы для сериализации и десериализации. Кстати boost::seralization гарантирует, что порядок байт при сериализации будет изменён, если потребуется, так что можно спокойно передать long с x86 на PowerPC. &lt;br /&gt;
&lt;br /&gt;
Немного поправленный, пример, использования и результаты работы: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;quot;stdafx.h&amp;quot;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
#include &amp;lt;fstream&amp;gt;&lt;br /&gt;
#include &amp;lt;string&amp;gt;&lt;br /&gt;
#include &amp;lt;fstream&amp;gt;&lt;br /&gt;
#include &amp;lt;vector&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// include headers that implement a archive in simple text format&lt;br /&gt;
#include &amp;lt;boost/archive/text_oarchive.hpp&amp;gt;&lt;br /&gt;
#include &amp;lt;boost/archive/text_iarchive.hpp&amp;gt;&lt;br /&gt;
#include &amp;lt;boost/archive/binary_iarchive.hpp&amp;gt;&lt;br /&gt;
#include &amp;lt;boost/archive/binary_oarchive.hpp&amp;gt;&lt;br /&gt;
#include &amp;lt;boost/archive/xml_iarchive.hpp&amp;gt;&lt;br /&gt;
#include &amp;lt;boost/archive/xml_oarchive.hpp&amp;gt;&lt;br /&gt;
// включаем, что бы сериализация работала с векторами&lt;br /&gt;
#include &amp;lt;boost/serialization/vector.hpp&amp;gt;&lt;br /&gt;
// влючаем, что бы нормально проходила сериализация XML&lt;br /&gt;
#include &amp;lt;boost/serialization/nvp.hpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
class gps_position&lt;br /&gt;
{&lt;br /&gt;
private:&lt;br /&gt;
	friend class boost::serialization::access;&lt;br /&gt;
&lt;br /&gt;
	template&amp;lt;class Archive&amp;gt;&lt;br /&gt;
	void serialize(Archive &amp;amp; ar, const unsigned int version)&lt;br /&gt;
	{&lt;br /&gt;
		// тоже что и make_nvp, только имя параметра выводится в макросе&lt;br /&gt;
		ar &amp;amp; BOOST_SERIALIZATION_NVP(degrees);&lt;br /&gt;
		ar &amp;amp; BOOST_SERIALIZATION_NVP(minutes);&lt;br /&gt;
		ar &amp;amp; BOOST_SERIALIZATION_NVP(seconds);&lt;br /&gt;
	}&lt;br /&gt;
	int degrees;&lt;br /&gt;
	int minutes;&lt;br /&gt;
	float seconds;&lt;br /&gt;
public:&lt;br /&gt;
	gps_position(){};&lt;br /&gt;
	gps_position(int d, int m, float s) :&lt;br /&gt;
	degrees(d), minutes(m), seconds(s)&lt;br /&gt;
	{}&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
template&amp;lt;typename TIArch, typename TOArch, typename TClass&amp;gt;&lt;br /&gt;
void TestArch(const std::string &amp;amp; file, int flags, const TClass &amp;amp; cont)&lt;br /&gt;
{&lt;br /&gt;
	&lt;br /&gt;
	{ // Сериализуем&lt;br /&gt;
		std::ofstream ofs(file.c_str(), std::ios::out|flags);&lt;br /&gt;
		TOArch oa(ofs);&lt;br /&gt;
		// make_nvp создаёт пару имя-значение, которая отразится в XML&lt;br /&gt;
		// если не используем XML архив, то можно пару не создавать&lt;br /&gt;
		oa &amp;lt;&amp;lt; boost::serialization::make_nvp(&amp;quot;Test_Object&amp;quot;, cont); &lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	TClass newg;&lt;br /&gt;
	{ // Десериализуем&lt;br /&gt;
		std::ifstream ifs(file.c_str(), std::ios::in|flags);&lt;br /&gt;
		TIArch ia(ifs);&lt;br /&gt;
		ia &amp;gt;&amp;gt; boost::serialization::make_nvp(&amp;quot;Test_Object&amp;quot;,newg);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	{ // Еще раз сериализуем, что бы потом сравнить результаты двух сериализаций&lt;br /&gt;
		// и убедится, что десериализациия прошла корректно&lt;br /&gt;
		std::ofstream ofs((file+&amp;quot;.tmp&amp;quot;).c_str(), std::ios::out|flags);&lt;br /&gt;
		TOArch oa(ofs);&lt;br /&gt;
		oa &amp;lt;&amp;lt; boost::serialization::make_nvp(&amp;quot;Test_Object&amp;quot;, cont);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int _tmain(int argc, _TCHAR* argv[])&lt;br /&gt;
{&lt;br /&gt;
	std::ofstream ofs(&amp;quot;filename&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	std::vector&amp;lt;gps_position&amp;gt; v;&lt;br /&gt;
	v.push_back(gps_position(35, 59, 24.567f));&lt;br /&gt;
	v.push_back(gps_position(36, 60, 25.567f));&lt;br /&gt;
	v.push_back(gps_position(37, 61, 26.567f));&lt;br /&gt;
&lt;br /&gt;
	using namespace boost::archive;&lt;br /&gt;
	TestArch&amp;lt;text_iarchive, text_oarchive&amp;gt;(&amp;quot;text_arch.dump&amp;quot;, 0, v);&lt;br /&gt;
	TestArch&amp;lt;binary_iarchive, binary_oarchive&amp;gt;(&amp;quot;binary_arch.dump&amp;quot;, std::ios::binary, v);&lt;br /&gt;
	TestArch&amp;lt;xml_iarchive, xml_oarchive&amp;gt;(&amp;quot;xml_arch.dump&amp;quot;, 0, v);&lt;br /&gt;
&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Файл text_arch.dump: &amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
22 serialization::archive 3 0 0 3 0 0 35 59 24.566999 36 60 25.566999 37 61 26.566999&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Как видите использовани NVP, никак не отразилось на внешнем виде архива. &lt;br /&gt;
&lt;br /&gt;
Файл xml_arch.dump: &amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot; standalone=&amp;quot;yes&amp;quot; ?&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE boost_serialization&amp;gt;&lt;br /&gt;
&amp;lt;boost_serialization signature=&amp;quot;serialization::archive&amp;quot; version=&amp;quot;3&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Test_Object class_id=&amp;quot;0&amp;quot; tracking_level=&amp;quot;0&amp;quot; version=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;count&amp;gt;3&amp;lt;/count&amp;gt;&lt;br /&gt;
	&amp;lt;item class_id=&amp;quot;1&amp;quot; tracking_level=&amp;quot;0&amp;quot; version=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;degrees&amp;gt;35&amp;lt;/degrees&amp;gt;&lt;br /&gt;
		&amp;lt;minutes&amp;gt;59&amp;lt;/minutes&amp;gt;&lt;br /&gt;
		&amp;lt;seconds&amp;gt;24.566999&amp;lt;/seconds&amp;gt;&lt;br /&gt;
	&amp;lt;/item&amp;gt;&lt;br /&gt;
	&amp;lt;item&amp;gt;&lt;br /&gt;
		&amp;lt;degrees&amp;gt;36&amp;lt;/degrees&amp;gt;&lt;br /&gt;
		&amp;lt;minutes&amp;gt;60&amp;lt;/minutes&amp;gt;&lt;br /&gt;
		&amp;lt;seconds&amp;gt;25.566999&amp;lt;/seconds&amp;gt;&lt;br /&gt;
	&amp;lt;/item&amp;gt;&lt;br /&gt;
	&amp;lt;item&amp;gt;&lt;br /&gt;
		&amp;lt;degrees&amp;gt;37&amp;lt;/degrees&amp;gt;&lt;br /&gt;
		&amp;lt;minutes&amp;gt;61&amp;lt;/minutes&amp;gt;&lt;br /&gt;
		&amp;lt;seconds&amp;gt;26.566999&amp;lt;/seconds&amp;gt;&lt;br /&gt;
	&amp;lt;/item&amp;gt;&lt;br /&gt;
&amp;lt;/Test_Object&amp;gt;&lt;br /&gt;
&amp;lt;/boost_serialization&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Бинарный архив приводить не стану&amp;amp;nbsp;:) не очень красочно, но занимает он 79 байт, из которых 39 заголовок и 40 полезная информация. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
За универсальность boost::serialization придётся заплатить: &lt;br /&gt;
&lt;br /&gt;
*Время компиляции шаблоны могут разворачиваться довольно долго.&lt;br /&gt;
*Скорость: стек вызовов для сериализации какой-нибуть не слишком больной структурки, может быть просто ужасающим вызовов 20-30.&lt;br /&gt;
&lt;br /&gt;
Но, если вы не пишете систему массового обслуживания, то это то, что вам нужно, с помощью этой библиотеки можно даже реализовать маршалинг или RPC. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; Надеюсь в общих чертах, понятно, как примерно работает сериализация и десериализация, и если понадобится можно реализовать свою сериализацию. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; Вот пример своей реализации архива, который я использую вместо boost:binary_iarchive (была ОЧЕНЬ важна скорость, а универсальность не очень, но для маршалинга хватает), делал так, чтобы можно было использовать один вместо другого без переделки кода: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
class binary_iarchive&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
	typedef serialization::container container;&lt;br /&gt;
	typedef container::iterator iterator;&lt;br /&gt;
&lt;br /&gt;
	container &amp;amp;cont_;&lt;br /&gt;
	size_t currentPos_;&lt;br /&gt;
	typedef boost::mpl::bool_&amp;lt;false&amp;gt; is_saving;&lt;br /&gt;
	binary_iarchive(container &amp;amp; cont, long = 0)&lt;br /&gt;
			: cont_(cont)&lt;br /&gt;
			, currentPos_(0)&lt;br /&gt;
	{&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	template&amp;lt;typename T&amp;gt;&lt;br /&gt;
	binary_iarchive &amp;amp; operator&amp;gt;&amp;gt;(T &amp;amp; val)&lt;br /&gt;
	{&lt;br /&gt;
		deserialize_impl(val);&lt;br /&gt;
		return *this;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	void reset()&lt;br /&gt;
	{&lt;br /&gt;
		resetPos();&lt;br /&gt;
		cont_.clear();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	template&amp;lt;typename T&amp;gt;&lt;br /&gt;
	inline void raw_read(T beginPos, size_t len)&lt;br /&gt;
	{&lt;br /&gt;
		if (static_cast&amp;lt;size_t&amp;gt;(cont_.size() - currentPos_) &amp;lt; len)&lt;br /&gt;
			throw std::runtime_error(&amp;quot;No more data&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
		iterator pos = cont_.begin() + currentPos_;&lt;br /&gt;
		iterator endPos = pos + len;&lt;br /&gt;
		std::copy(pos, endPos, beginPos);&lt;br /&gt;
		currentPos_ = currentPos_ + len;&lt;br /&gt;
	}&lt;br /&gt;
private:&lt;br /&gt;
	// Fundamental&lt;br /&gt;
	template&amp;lt;typename T&amp;gt;&lt;br /&gt;
	inline void deserialize_impl(T &amp;amp; val, typename boost::enable_if&amp;lt;boost::is_fundamental&amp;lt;T&amp;gt; &amp;gt;::type* dummy = 0)&lt;br /&gt;
	{&lt;br /&gt;
		raw_read(reinterpret_cast&amp;lt;char*&amp;gt;(&amp;amp;val), sizeof(T));&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	//Classes&lt;br /&gt;
	template&amp;lt;typename T&amp;gt;&lt;br /&gt;
	inline void deserialize_impl(T &amp;amp; val, typename boost::enable_if&amp;lt;boost::is_class&amp;lt;T&amp;gt; &amp;gt;::type* dummy = 0)&lt;br /&gt;
	{&lt;br /&gt;
		deserialize_class(*this, val);&lt;br /&gt;
	}&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Кое-что порезал, что бы не расслаблялись&amp;amp;nbsp;:) &lt;br /&gt;
&lt;br /&gt;
[[Category:FAQ]] [[Category:FAQ:ANSI_CPP]] [[Category:FAQ:STL]] [[Category:FAQ:STL_BOOST]]&lt;/div&gt;</summary>
		<author><name>Mczim</name></author>	</entry>

	<entry>
		<id>https://wiki.shelek.ru/index.php?title=FAQ:WinAPI,_VCPP_Part_3&amp;diff=434</id>
		<title>FAQ:WinAPI, VCPP Part 3</title>
		<link rel="alternate" type="text/html" href="https://wiki.shelek.ru/index.php?title=FAQ:WinAPI,_VCPP_Part_3&amp;diff=434"/>
				<updated>2008-08-15T05:54:37Z</updated>
		
		<summary type="html">&lt;p&gt;Mczim: пробел перед знаком вопроса в заголовке&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Имеется приложение на основе CRichEditView. Как узнать, что пользователь меняет текст?===&lt;br /&gt;
Добавить обработчик сообщения EN_CHANGE. Сообщение генерируется CRichEditView каждый раз, когда пользователь изменяет текст в окне CRichEditView&lt;br /&gt;
===Чем метод CArray::GetSize отличается от метода CArray::GetCount?===&lt;br /&gt;
Абсолютно ничем. (Скорее всего, были предыдущие библиотеки, в которых функции, одинаковые по смыслу, имели разные имена. Поэтому в целях совместимости оставили оба)&lt;br /&gt;
===Как загрузить строку из ресурса?===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CString m_Temp;&lt;br /&gt;
m_Temp.LoadString(ID_MYSTRING);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как поменять иконку у элемента (item) в CListCtrl?===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//заполняем структуру LVITEM&lt;br /&gt;
LVITEM lvItem;&lt;br /&gt;
memset(&amp;amp;lvItem,0,sizeof(lvItem));&lt;br /&gt;
	&lt;br /&gt;
lvItem.mask = LVIF_IMAGE;//меняться будет картинка&lt;br /&gt;
lvItem.iItem = ...;// индекс элемента списка (Zero-based)&lt;br /&gt;
lvItem.iSubItem = 0;&lt;br /&gt;
lvItem.iImage = ...; //индекс иконки (из списка контрола)&lt;br /&gt;
	&lt;br /&gt;
pList-&amp;gt;SetItem(&amp;amp; lvItem);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Имеется класс Class1, содержащий мембер типа указатель на Class2. В Class2 также имеется указатель на Class1. Компилятор выдаёт ошибку. Что надо делать?===&lt;br /&gt;
Предварительно объявляем класс Class2. Тогда компилятору будет известно, что описание класса Class2 будет встречено дальше, и станет возможным объявление указателей на класс до описания самого класса.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Class2;//предопределение&lt;br /&gt;
	&lt;br /&gt;
Class1&lt;br /&gt;
{&lt;br /&gt;
	Class2* p;&lt;br /&gt;
};&lt;br /&gt;
	&lt;br /&gt;
Class2&lt;br /&gt;
{&lt;br /&gt;
	Class1* p;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как переключить раскладку в другом (то есть в активном) процессе?===&lt;br /&gt;
Использовать функции:&lt;br /&gt;
   GetKeyboardLayout - определить текущую раскладку&lt;br /&gt;
   LoadKeyboardLayout - загрузить новую раскладку&lt;br /&gt;
&lt;br /&gt;
см.также&lt;br /&gt;
   VerLanguageName - получить строку с описанием языка&lt;br /&gt;
&lt;br /&gt;
(подробности - в MSDN)&lt;br /&gt;
===Как получить хендл контрола Edit зная его ID?===&lt;br /&gt;
Пусть контрол лежит на окне CMyWnd&lt;br /&gt;
Тогда:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void CMyWnd::некая_процедура()&lt;br /&gt;
{&lt;br /&gt;
	//для MFC&lt;br /&gt;
	CEdit* ed=(CEdit* ) GetDlgItem(ID_EDIT1);&lt;br /&gt;
	HWND hwnd=ed-&amp;gt;GetSafeHwnd();&lt;br /&gt;
	...&lt;br /&gt;
	&lt;br /&gt;
	//для Win32 API&lt;br /&gt;
	HWND hwnd=GetDlgItem(m_hWnd,ID_EDIT1);&lt;br /&gt;
	...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Как из дочернего окна закрыть приложение?===&lt;br /&gt;
Нужно послать родительскому окну (*pParent) сообщение WM_CLOSE:&lt;br /&gt;
 pParent-&amp;gt;PostMessage(WM_CLOSE);//MFC&lt;br /&gt;
или&lt;br /&gt;
 ::PostMessage(pParent-&amp;gt;m_hWnd,WM_CLOSE,(WPARAM)0,(LPARAM)0);//API&lt;br /&gt;
===Как корректно перевести BSTR в CString и наоборот?===&lt;br /&gt;
Нужно просто присвоить переменной типа CString переменную типа BSTR.&lt;br /&gt;
Оператор = класса CString сам всё переведёт.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//указатель на будущий буфер с BSTR.&lt;br /&gt;
//	(По сути, BSTR определён как &lt;br /&gt;
//	typedef WCHAR* BSTR;&lt;br /&gt;
//	то есть указатель на 16-битный символ юникод)&lt;br /&gt;
	&lt;br /&gt;
BSTR bstrHE=0;&lt;br /&gt;
	&lt;br /&gt;
CString Str=&amp;quot;мой текст&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
//Выделить память и загрузить адрес блока в bstrHE&lt;br /&gt;
bstrHE=Str.AllocSysString();&lt;br /&gt;
	&lt;br /&gt;
//...	&lt;br /&gt;
//тут работаем с bstrHE[]&lt;br /&gt;
//...&lt;br /&gt;
	&lt;br /&gt;
//освобождаем память&lt;br /&gt;
SysFreeString(bstrHE);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Как получить доступ к графическим ресурсам элементов текущей темы оформления Windows?===&lt;br /&gt;
Использовать функции&lt;br /&gt;
&lt;br /&gt;
OpenThemeData()&lt;br /&gt;
DrawThemeBackground()&lt;br /&gt;
DrawFrameControl()&lt;br /&gt;
CloseThemeData().&lt;br /&gt;
&lt;br /&gt;
(подробности - в MSDN)&lt;br /&gt;
===Имеется класс , производный от CDialog. Когда диалог в фокусе, нажатие на Enter или Esc приводит к закрытию диалога. Как это запретить?===&lt;br /&gt;
При нажатии Enter происходит выполнение команды IDOK,&lt;br /&gt;
при нажатии Esc - IDCANCEL.&lt;br /&gt;
Нужно переопределить в классе виртуальные функции OnOk() и OnCancel(),&lt;br /&gt;
которые соответственно вызываются для этих команд. При помощи&lt;br /&gt;
визарда эти функции добавить можно так: Положить на диалог две кнопки&lt;br /&gt;
с идентификаторами IDOK и IDCANCEL (при создании нового диалога они там&lt;br /&gt;
есть сразу), затем двойной клик по кнопке добавляет соответствующий&lt;br /&gt;
обработчик. В обработчиках надо удалить вызовы СDialog::OnOK() и&lt;br /&gt;
CDialog::OnCancel(), тогда диалог закрываться не будет.&lt;br /&gt;
Однако тогда диалог станет невозможно закрыть кнопкой с крестиком  :)&lt;br /&gt;
&lt;br /&gt;
Лечить так: добавить обработчик сообщения WM_CLOSE - OnClose(), и в нём&lt;br /&gt;
сделать вызов OnOk() или OnCancel() :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void CPlayersPropsDialog::OnClose() &lt;br /&gt;
{&lt;br /&gt;
	CDialog::OnClose();&lt;br /&gt;
	CDialog::OnCancel();//добавлено&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===VC++6. Я написал простейший макрос, а компилятор на него ругается. Ума не приложу, что за глюк?===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	#define my_macr(x,y,z) \&lt;br /&gt;
		z=\&lt;br /&gt;
		(x+y)*\&lt;br /&gt;
		(x-y)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Скорее всего после одного из символов соединения строк &amp;quot;\&amp;quot; имеется&lt;br /&gt;
пробел или табуляция. Их надо удалить. Можно найти их &amp;quot;наощупь&amp;quot;, а&lt;br /&gt;
можно включить показ непечатных символов в студии. Найти эту команду&lt;br /&gt;
можно так:&lt;br /&gt;
Tools-&amp;gt;Customize...-&amp;gt;вкладка Commands. В окошке Category выбрать&lt;br /&gt;
&amp;quot;Edit&amp;quot;, и среди кнопок справа найти кнопку, на которой написано &amp;quot;a.b&amp;quot;&lt;br /&gt;
Эту кнопку надо перетащить на одну из панелей инструментов студии.&lt;br /&gt;
&lt;br /&gt;
===Как получить список всех процесов, включая idle?===&lt;br /&gt;
Использовать функции&lt;br /&gt;
Process32First()&lt;br /&gt;
Precess32Next()&lt;br /&gt;
&lt;br /&gt;
===Как программно установить переменные окружения?===&lt;br /&gt;
Чтобы добавить или изменить их программно, необходимо воспользоваться&lt;br /&gt;
ключом реестра HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\&lt;br /&gt;
Session Manager\Environment, а затем отправить широковещательное&lt;br /&gt;
сообщение WM_SETTINGCHANGE. Это позволит приложениям узнать об&lt;br /&gt;
изменениях:&lt;br /&gt;
&lt;br /&gt;
::SendMessage(HWND_BROADCAST,WM_SETTINGCHANGE,0,0);&lt;br /&gt;
===Как сделать, чтобы у окна был черный фон?===&lt;br /&gt;
переопределить обработчик сообщения WM_CTLCOLOR - OnCtlColor() :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CBrush br(RGB(0,0,0));&lt;br /&gt;
	&lt;br /&gt;
HBRUSH CMyDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) &lt;br /&gt;
{&lt;br /&gt;
	HBRUSH hbr = CMyDlg::OnCtlColor(pDC, pWnd, nCtlColor);&lt;br /&gt;
	&lt;br /&gt;
	//фон диалога (или вьюшки)&lt;br /&gt;
	if(nCtlColor==CTLCOLOR_DLG)&lt;br /&gt;
	{&lt;br /&gt;
		return (HBRUSH)br;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	//фон статиков (если нужно)&lt;br /&gt;
	if(nCtlColor==CTLCOLOR_STATIC)&lt;br /&gt;
	{&lt;br /&gt;
		//делаем фон текста статика прозрачным&lt;br /&gt;
		pDC-&amp;gt;SetBkMode(TRANSPARENT);&lt;br /&gt;
		return (HBRUSH)br;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	return hbr;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Почему на моем компьютере экзешник, созданный в MFC запускается, а на других компьютерах - нет? Требует какую-то  dll-ку.===&lt;br /&gt;
Нужно выбирать режим Release :&lt;br /&gt;
&lt;br /&gt;
Menu-&amp;gt;Build-&amp;gt;Configurations...-&amp;gt;Release,&lt;br /&gt;
&lt;br /&gt;
и экзешник, соответственно, брать из папки Release проекта&lt;br /&gt;
===Как в диалог добавить меню?===&lt;br /&gt;
Надо сделать в ресурсах меню, затем вставить в диалог:&lt;br /&gt;
&lt;br /&gt;
открыть в редакторе диалог, в свойствах (во вкладке General, окошко Menu) указать идентивикатор ресурса меню.&lt;br /&gt;
При помощи визарда добавить для меню обработчики OnCommand() и OnUpdateСommand().&lt;br /&gt;
===Я добавил визардом меню в диалог. Добавил обработчики для пунктов меню. Пункты работают, но OnUpdate для пунктов не вызывается - то есть не получается ни затенить, ни чек поставить. Что делать?===&lt;br /&gt;
В диалоге у меню апдейта не происходит сам, в отличие от мейнфрейма.&lt;br /&gt;
Для этого нужно сделать самим апдейт в обработчике сообщения WM_KICKIDLE.&lt;br /&gt;
Визардом обработчик не добавляется, поэтому можно переопределить виртуальную DefWindowProc() и там обработать:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;afxpriv.h&amp;gt;	//этот файл надо включить, там определёна WM_KICKIDLE&lt;br /&gt;
&lt;br /&gt;
LRESULT CMyDialog::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam) &lt;br /&gt;
{&lt;br /&gt;
	if(message==WM_KICKIDLE)&lt;br /&gt;
	{&lt;br /&gt;
		//делаем апдейт для всех пунктов меню&lt;br /&gt;
		CMenu* pMainMenu=GetMenu();&lt;br /&gt;
		if(pMainMenu)&lt;br /&gt;
		{&lt;br /&gt;
			CCmdUI cmdUI;&lt;br /&gt;
			for (UINT n=0; n &amp;lt; pMainMenu-&amp;gt;GetMenuItemCount(); ++n)&lt;br /&gt;
			{&lt;br /&gt;
				CMenu* pSubMenu = pMainMenu-&amp;gt;GetSubMenu(n);&lt;br /&gt;
				if(!pSubMenu)continue;&lt;br /&gt;
	&lt;br /&gt;
				cmdUI.m_nIndexMax = pSubMenu-&amp;gt;GetMenuItemCount();&lt;br /&gt;
				for (UINT i = 0; i &amp;lt; cmdUI.m_nIndexMax;++i)&lt;br /&gt;
				{&lt;br /&gt;
					cmdUI.m_nIndex = i;&lt;br /&gt;
					cmdUI.m_nID = pSubMenu-&amp;gt;GetMenuItemID(i);&lt;br /&gt;
					cmdUI.m_pMenu = pSubMenu;&lt;br /&gt;
					cmdUI.DoUpdate(this, FALSE);&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	return CDialog::DefWindowProc(message, wParam, lParam);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Как на Visual C++ 6.0 в Главном окне отключить системное меню (в левом верхнем углу) и кнопки(в правом верхнем углу)?===&lt;br /&gt;
При создании окна нужно убрать стиль WS_SYSMENU&lt;br /&gt;
(теперь пользователь корректно может закрыть окно только Alt+F4,&lt;br /&gt;
ну или если вы предоставите ему дополнительную возможность сделать это)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пример 1. (для SDI, MDI)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//этот обработчик уже добавлен визардом&lt;br /&gt;
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT&amp;amp; cs)&lt;br /&gt;
{&lt;br /&gt;
	if( !CFrameWnd::PreCreateWindow(cs) )&lt;br /&gt;
		return FALSE;&lt;br /&gt;
	// TODO: Modify the Window class or styles here by modifying&lt;br /&gt;
	//  the CREATESTRUCT cs&lt;br /&gt;
&lt;br /&gt;
	///////////////////////////////&lt;br /&gt;
	//добавленная часть&lt;br /&gt;
	{&lt;br /&gt;
		//убираем стиль&lt;br /&gt;
		cs.style&amp;amp;=~WS_SYSMENU;&lt;br /&gt;
	}&lt;br /&gt;
	///////////////////////////////&lt;br /&gt;
&lt;br /&gt;
	return TRUE;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Пример 2. (для диалога)&lt;br /&gt;
Если диалог описан в ресурсах, то в свойствах диалога убрать галочки&lt;br /&gt;
  &amp;quot;System menu&amp;quot;&lt;br /&gt;
  &amp;quot;Minimize box&amp;quot;&lt;br /&gt;
  &amp;quot;Maximize box&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===Хочу сделать так, чтобы пользователь не мог нажать на кнопку, пока программа не разрешит.===&lt;br /&gt;
Нужно применить метод класса CWnd::EnableWindow(...) для кнопки.&lt;br /&gt;
Значение параметра 0 делает кнопку неактивной, 1 - делает активной.&lt;br /&gt;
(кстате, не только для кнопки можно, а для любого класса, производного&lt;br /&gt;
от класса CWnd)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пусть имеется некий диалог, на нём лежит кнопка c ID == IDC_1.&lt;br /&gt;
в любом месте кода диалога (кроме конструктора и деструктора , хотя, если&lt;br /&gt;
проверить наличие валидного хендла диалога, как в примере, то ничего&lt;br /&gt;
страшного не будет и там)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//делаем кнопку неактивной&lt;br /&gt;
if(m_hWnd)&lt;br /&gt;
{&lt;br /&gt;
	CWnd* pw=0;&lt;br /&gt;
	pw=GetDlgItem(IDC_1);&lt;br /&gt;
	if(pw)pw-&amp;gt;EnableWindow(0);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Что означают сообщения, которые студия выводит при компиляции, вроде таких : Loaded 'C:\WINDOWS\SYSTEM\WSOCK32.DLL', no matching symbolic information found. ===&lt;br /&gt;
Это строка говорит о том, что студия не смогла найти отладочные&lt;br /&gt;
символы для WSOCK32.DLL. В этом нет ничего страшного, просто при наличии&lt;br /&gt;
отладочных символов в процессе отладки можно получить доступ к именам&lt;br /&gt;
функции из системных DLL. Например, вместо&lt;br /&gt;
 KERNEL32! 0x77E8B184() -&lt;br /&gt;
 увидим&lt;br /&gt;
 KERNEL32!CreateThread.&lt;br /&gt;
===Как обработать сообщения, которое приходит к некому контролу (скажем CEdit)?===&lt;br /&gt;
Нужно произвести от CEdit свой класс, и в виртуальной процедуре класса WindowProc перехватить нужные сообщения.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
virtual LRESULT WindowProc(&lt;br /&gt;
   UINT message,&lt;br /&gt;
   WPARAM wParam,&lt;br /&gt;
   LPARAM lParam &lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Пример. Полностью выключаем, скажем, обработку сообщения WM_CHAR&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	LRESULT CMyEdit::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) &lt;br /&gt;
	{&lt;br /&gt;
		switch(message)&lt;br /&gt;
		{&lt;br /&gt;
			case WM_CHAR:&lt;br /&gt;
			{&lt;br /&gt;
				return 0;&lt;br /&gt;
			}&lt;br /&gt;
			break;&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		return CEdit::WindowProc(message, wParam, lParam);&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Чтобы связать экземпляр класса с контролом на форме, добавьте визардом для&lt;br /&gt;
контрола переменную класса (выбрав не Value а Control).&lt;br /&gt;
&lt;br /&gt;
===Как настроить количество пробелов в табуляции?===&lt;br /&gt;
Tools-&amp;gt;Options-&amp;gt;Tabs-&amp;gt;Insert Spaces&lt;br /&gt;
(или  правой кнопкой мыши по тексту-&amp;gt; properties)&lt;br /&gt;
===Как автоматически расставить отступы?===&lt;br /&gt;
Выделить текст для форматирования, нажать Alt+F8&lt;br /&gt;
&lt;br /&gt;
Есть ещё программа Artistic Style, которая занимается&lt;br /&gt;
переформатированием кода&lt;br /&gt;
http://sourceforge.net/projects/astyle/&lt;br /&gt;
===Поиск границ блока===&lt;br /&gt;
&amp;quot;CTRL+ }&amp;quot; ищет парную фигурную скобку в тексте и переходит на неё&lt;br /&gt;
===Вертикальное выделение текста===&lt;br /&gt;
&amp;quot;Alt + выделение мышкой&amp;quot; - позволяет выделять вертикальные фрагменты текста&lt;br /&gt;
===Как узнать количество установленных в CListCtrl столбцов?===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CListCtrl* pL=...; //указатель на переменную-контрол&lt;br /&gt;
&lt;br /&gt;
int count=pL-&amp;gt;GetHeaderCtrl()-&amp;gt;GetItemCount();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Как получить иконку приложения?===&lt;br /&gt;
Если приложение запущено, то нужно найти его главное окно и&lt;br /&gt;
послать ему сообщение WM_GETICON.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//функция возвращант хендл иконки &lt;br /&gt;
LRESULT SendMessage(hWnd, WM_GETICON, wParam, 0);&lt;br /&gt;
&lt;br /&gt;
//hWnd == хендл окна приложения&lt;br /&gt;
//wParam == &lt;br /&gt;
//	1)==ICON_BIG - получить большую иконку&lt;br /&gt;
//	2)==ICON_SMALL - получить маленькую иконку&lt;br /&gt;
//	3)==ICON_SMALL2 - получить маленькую иконку, если она определена&lt;br /&gt;
//				в приложении. Если её нет, то маленькую иконку, &lt;br /&gt;
//				сгенерированную системой из большой иконки&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как в CString можно найти или вырезать часть строки?===&lt;br /&gt;
есть такие методы в CString:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//вырезает кусок строки&lt;br /&gt;
CString Mid(int nFirst) const;&lt;br /&gt;
CString Mid(int nFirst,  int nCount) const;&lt;br /&gt;
&lt;br /&gt;
//возвращает кусок строки (сначала или с конца)&lt;br /&gt;
CString Left(int nCount ) const;&lt;br /&gt;
CString Right(int nCount ) const;&lt;br /&gt;
&lt;br /&gt;
//возвращает начальный кусок строки, в котором есть только&lt;br /&gt;
//символы из набора,представленного в lpszCharSet&lt;br /&gt;
CString SpanIncluding(LPCTSTR lpszCharSet ) const;&lt;br /&gt;
&lt;br /&gt;
//возвращает начальный кусок строки, в котором нет&lt;br /&gt;
//символов из набора,представленного в lpszCharSet&lt;br /&gt;
CString SpanExcluding(LPCTSTR lpszCharSet ) const; &lt;br /&gt;
&lt;br /&gt;
//убирает &amp;quot;пробелоподобные&amp;quot; символы из самого начала строки&lt;br /&gt;
//(то есть - пробел, табуляцию (\t) , возврат каретки, перевод строки (/r/n))&lt;br /&gt;
void TrimLeft();&lt;br /&gt;
//убирает все повторы символа из самого начала строки&lt;br /&gt;
void TrimLeft(TCHAR chTarget );&lt;br /&gt;
//убирает из самого начала строки все символа из набора lpszTargets &lt;br /&gt;
void TrimLeft(LPCTSTR lpszTargets ); &lt;br /&gt;
&lt;br /&gt;
void TrimRight();&lt;br /&gt;
void TrimRight(TCHAR chTarget );&lt;br /&gt;
void TrimRight(LPCTSTR lpszTargets ); &lt;br /&gt;
&lt;br /&gt;
//поиск в строке&lt;br /&gt;
int Find( TCHAR ch ) const;&lt;br /&gt;
int Find( LPCTSTR lpszSub ) const;&lt;br /&gt;
int Find( TCHAR ch, int nStart ) const;&lt;br /&gt;
int Find( LPCTSTR pstr, int nStart ) const;&lt;br /&gt;
&lt;br /&gt;
//поиск, начиная с конца&lt;br /&gt;
int ReverseFind( TCHAR ch ) const;&lt;br /&gt;
&lt;br /&gt;
//поиск позиции первого символа, одного из набора,&lt;br /&gt;
// представленного в lpszCharSet&lt;br /&gt;
int FindOneOf( LPCTSTR lpszCharSet ) const;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Есть у меня CListBox и я в ходе выполнения программы добавляю в него строки. Но я не могу посмотреть что именно добавляется. Вывод результатов происходит в конце выполнения процедуры...===&lt;br /&gt;
Если нужно делать принудительную перерисовку окна во время&lt;br /&gt;
длительных вычислений, то нужно вызывать для окна, которое&lt;br /&gt;
надо перерисовать метод&lt;br /&gt;
  RedrawWindow()&lt;br /&gt;
с параметрами по умолчанию, или пару&lt;br /&gt;
  Invalidate(0);&lt;br /&gt;
  UpdateWindow();&lt;br /&gt;
Это приводит к пометке всего окна к перерисовке и отправлению&lt;br /&gt;
сообщения WM_PAINT в оконную процедуру в обход очереди&lt;br /&gt;
сообщений, вызывая немедленную перерисовку окна.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CWnd* pw=...;//окно, которое надо перерисовывать&lt;br /&gt;
&lt;br /&gt;
for(int i=0;i&amp;lt;10000)&lt;br /&gt;
{&lt;br /&gt;
	//меняется содержимое окна&lt;br /&gt;
	//...&lt;br /&gt;
&lt;br /&gt;
	//немедленная перерисовка&lt;br /&gt;
	pw-&amp;gt;Invalidate(0);&lt;br /&gt;
	pw-&amp;gt;UpdateWindow();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Я написал DLL, которую используют несколько приложений. Всё вроде работает, но когда происходит очередной вызов функции из DLL, почему то данные в функции обнуляются. С чем это связано?===&lt;br /&gt;
Переменные и массивы в DLL, содержимое которых должно использоваться несколькими процессами, должны объявляться статическими. Статическая переменная или массив инициализируются только один раз в момент загрузки DLL.&lt;br /&gt;
Пример:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DWORD calltest()&lt;br /&gt;
{&lt;br /&gt;
	//будет выполнено только при первом вызове&lt;br /&gt;
	static DWORD callcount=0;&lt;br /&gt;
	static DWORD str[1000]={0}; &lt;br /&gt;
&lt;br /&gt;
	//будет выполняться каждый раз&lt;br /&gt;
	return ++callcount;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Как открыть проекцию файла в память и как с ней работать?===&lt;br /&gt;
Создаем проекцию&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HANDLE CreateFileMapping(&lt;br /&gt;
  HANDLE hFile,	//хендл уже открытого файла&lt;br /&gt;
  LPSECURITY_ATTRIBUTES lpAttributes,&lt;br /&gt;
  DWORD flProtect,	//способ открытия проекции&lt;br /&gt;
  DWORD dwMaximumSizeHigh,	//размер файла (старшие 4 байта , обычно==0)&lt;br /&gt;
  DWORD dwMaximumSizeLow,	//размер файла (младшие 4 байта)&lt;br /&gt;
  LPCTSTR lpName&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Доступ к созданной проекции производится процедурой&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LPVOID MapViewOfFile(&lt;br /&gt;
  HANDLE hFileMappingObject, //хендл проекции&lt;br /&gt;
  DWORD dwDesiredAccess,	//способ работы с проекцией&lt;br /&gt;
  DWORD dwFileOffsetHigh,&lt;br /&gt;
  DWORD dwFileOffsetLow, //смещение от начала файла (младшие 4 байта)&lt;br /&gt;
  SIZE_T dwNumberOfBytesToMap //длина в байтах (если ==0 - то весь файл)&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
далее с файлом можно работать как с обычным массивом в памяти.&lt;br /&gt;
&lt;br /&gt;
После работы с проекцией, её надо освободить процедурой&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
BOOL UnmapViewOfFile(&lt;br /&gt;
  LPCVOID lpBaseAddress //адрес, который вернула процедура MapViewOfFile&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Пример.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HANDLE hMapFile=0;//для проекции&lt;br /&gt;
&lt;br /&gt;
HANDLE hFile=...;//хендл уже открытого файла&lt;br /&gt;
DWORD dwdFileLen=...;//размер открытого файла&lt;br /&gt;
&lt;br /&gt;
//создаём проекцию &amp;quot;только для чтения&amp;quot;&lt;br /&gt;
hMapFile=::CreateFileMapping(hFile,0,PAGE_READONLY,0,dwdFileLen,0);&lt;br /&gt;
&lt;br /&gt;
//хендл hFile можно закрыть уже здесь, в принципе,&lt;br /&gt;
//но мы сделаем это позже&lt;br /&gt;
&lt;br /&gt;
//получаем доступ к проекции (тоже только для чтения)&lt;br /&gt;
BYTE* pbyFile=(BYTE*)::MapViewOfFile(hMapFile,FILE_MAP_READ,0,0,0);&lt;br /&gt;
&lt;br /&gt;
///////////////////&lt;br /&gt;
//тут работаем с массивом pbyFile[dwdFileLen] как с обычным,&lt;br /&gt;
//только не забываем, что он открыт только для чтения&lt;br /&gt;
//...&lt;br /&gt;
//...&lt;br /&gt;
//...&lt;br /&gt;
///////////////////&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//отключаем файл данных от адресного пространства&lt;br /&gt;
UnmapViewOfFile(pbyFile);&lt;br /&gt;
&lt;br /&gt;
//освобождаем хендл проекции&lt;br /&gt;
CloseHandle(hMapFile)&lt;br /&gt;
&lt;br /&gt;
//освобождаем хендл открытого файла&lt;br /&gt;
CloseHandle(hFile);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Использую MFC Grid control 2.25, не получается отобразить картинку в ячейке. Как это делается?===&lt;br /&gt;
Нужно создать список изображений (CImageList), затем передать указатель на список в контрол. Поскольку контрол лишь копирует указатель, список должен создаваться динамически, либо быть членом класса, экземпляр которого существует всё время работы контрола.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 m_GridMarket&lt;br /&gt;
CImageList m_ImageList;&lt;br /&gt;
CGridCtrL m_Grid1&lt;br /&gt;
...&lt;br /&gt;
...&lt;br /&gt;
//неким образом создаётся список&lt;br /&gt;
m_ImageList.Create(...);&lt;br /&gt;
//...&lt;br /&gt;
&lt;br /&gt;
//вставляем в контрол&lt;br /&gt;
m_Grid1.SetImageList(&amp;amp;m_ImageList);&lt;br /&gt;
&lt;br /&gt;
//&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Как при помощи IPicture отобразить картинку из файла? ===&lt;br /&gt;
Пример - несложная функция, отображающая картинку из файла&lt;br /&gt;
&lt;br /&gt;
поддерживаются форматы&lt;br /&gt;
BMP, GIF, JPEG, PNG, TIFF, EMF&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;quot;atlconv.h&amp;quot;&lt;br /&gt;
#define HandleIsValid(H) (H!=(HANDLE)-1 &amp;amp;&amp;amp; H!=(HANDLE)0)&lt;br /&gt;
&lt;br /&gt;
//*pDestDC - CDC, на который предполагается вывод картинки&lt;br /&gt;
//pchzFilePath - путь к файлу&lt;br /&gt;
//pWid - (возвращает) ширина картинки&lt;br /&gt;
//pHig - (возвращает) высота картинки&lt;br /&gt;
bool DrawBitmapFromFile(CDC* pDestDC,const char* pchzFilePath,int *pWid=0,int *pHig=0)&lt;br /&gt;
{&lt;br /&gt;
	bool result=false;&lt;br /&gt;
&lt;br /&gt;
	if(pWid)*pWid=0;&lt;br /&gt;
	if(pHig)*pHig=0;&lt;br /&gt;
&lt;br /&gt;
	int Wid=0;&lt;br /&gt;
	int Hig=0;&lt;br /&gt;
&lt;br /&gt;
	IPicture* pPic=0;&lt;br /&gt;
	try&lt;br /&gt;
	{&lt;br /&gt;
		IPicture* ptmpPic=0;&lt;br /&gt;
		USES_CONVERSION;&lt;br /&gt;
		HRESULT hr;&lt;br /&gt;
&lt;br /&gt;
		CString txt=pchzFilePath;&lt;br /&gt;
		hr= ::OleLoadPicturePath(&lt;br /&gt;
			const_cast&amp;lt;LPOLESTR&amp;gt;(T2COLE(txt)),&lt;br /&gt;
			0,0,0,IID_IPicture,&lt;br /&gt;
			reinterpret_cast&amp;lt;void **&amp;gt;(&amp;amp;ptmpPic)&lt;br /&gt;
			);&lt;br /&gt;
&lt;br /&gt;
		if(hr==S_OK &amp;amp;&amp;amp; ptmpPic)&lt;br /&gt;
		{&lt;br /&gt;
			pPic=ptmpPic;&lt;br /&gt;
		}&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			throw 0;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		OLE_XPOS_HIMETRIC cxSrc;&lt;br /&gt;
		OLE_YPOS_HIMETRIC cySrc;&lt;br /&gt;
&lt;br /&gt;
		if(S_OK!=pPic-&amp;gt;get_Width(&amp;amp;cxSrc))throw 0;&lt;br /&gt;
		if(S_OK!=pPic-&amp;gt;get_Height(&amp;amp;cySrc))throw 0;&lt;br /&gt;
&lt;br /&gt;
		Wid=cxSrc/26;&lt;br /&gt;
		Hig=cySrc/26;&lt;br /&gt;
&lt;br /&gt;
		//рисуем&lt;br /&gt;
		if(S_OK !=pPic-&amp;gt;Render(pDestDC-&amp;gt;GetSafeHdc(),&lt;br /&gt;
			0,Hig,Wid,-Hig,0,0,cxSrc,cySrc,0))throw 0;&lt;br /&gt;
	}&lt;br /&gt;
	catch(...)&lt;br /&gt;
	{&lt;br /&gt;
		result=false;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if(pPic)&lt;br /&gt;
	{&lt;br /&gt;
		pPic-&amp;gt;Release();&lt;br /&gt;
		pPic=0;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	if(pWid)*pWid=Wid;&lt;br /&gt;
	if(pHig)*pHig=Hig;&lt;br /&gt;
&lt;br /&gt;
	return result;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===У меня модальное диалоговое окно, в нем поле редактирования мультилайновое, т.е. чтобы перейти на новую строку надо нажать ентер, но вызывается стандартный обработчик диалогового окна. Подскажите, что делать?===&lt;br /&gt;
Нужно в редакторе ресурсов поставить для CEdit окошка галочку&lt;br /&gt;
свойства WantReturn,&lt;br /&gt;
&lt;br /&gt;
или добавить ES_WANTRETURN при создании CEdit контрола динамически.&lt;br /&gt;
===Как выводят картинку-логотип(splash screen) при запуске программы? То есть, когда загружается программа на экран выводится картинка, потом она исчезает(загрузка программы закончена) и пользователь может приступать к работе ===&lt;br /&gt;
Для этого используется класс, производный от CDialog. Этот диалог после создания показывает себя на экран, выводя на себя рисунок. Также запускает таймер, по срабатывани которого диалог гасится. Создаётся диалог InitInstance приложения.&lt;br /&gt;
&lt;br /&gt;
В VC6++ также есть уже готовый компонент&lt;br /&gt;
Project-&amp;gt;Add To Project -&amp;gt; Components and Controls-&amp;gt;(в папке &amp;quot;Visual C++ Components&amp;quot; есть SplashScreen.)&lt;br /&gt;
&lt;br /&gt;
===Как сделать, чтобы при выпадении списка у ComboBox была не одна строка, а больше, вроде все свойства покрутил, не помогает Вместо выпадающего списка одна строка и скролл...===&lt;br /&gt;
В редакторе ресурсов надо щелкнуть в комбобоксе на треугольнике - появляется рамка для растягивания вниз - размер выпадающего списка.&lt;br /&gt;
===В VC++.net, что делать после того, как на форму установил ActiveX ListView, как объявить класс и переменную для этого элемента?===&lt;br /&gt;
Щёлкнуть правой кнопкой мыши на элементе, в меню - add variable или add class&lt;br /&gt;
&lt;br /&gt;
===Как вставить данные в буфер обмена (Clipboard)? Как их оттуда вытащить?===&lt;br /&gt;
&lt;br /&gt;
1) копирование в буфер обмена:&lt;br /&gt;
&lt;br /&gt;
  1.Готовим данные&lt;br /&gt;
    а.Выделяем память из кучи,  вызывая GlobalAlloc()&lt;br /&gt;
    б.Получаем указатель на выделенную память, вызывая GlobalLock()&lt;br /&gt;
    в.Заполняем данные&lt;br /&gt;
    г.Освобождаем указатель, вызывая GlobalUnlock();&lt;br /&gt;
&lt;br /&gt;
  2.Открываем буфер обмена, вызывая OpenClipboard();&lt;br /&gt;
  3.Очищаем буфер, вызывая EmptyClipboard();&lt;br /&gt;
  4.Вызываем SetClipboardData() один раз для каждого формата&lt;br /&gt;
      вставляемых данных (имеется в виду - если одни и те же&lt;br /&gt;
      данные представлены в разных форматах, и приложение&lt;br /&gt;
      может эти форматы создать)&lt;br /&gt;
  5.Закрываем буфер, вызывая CloseClipboard();&lt;br /&gt;
  6.ВЫЗЫВАТЬ GlobalFree() НЕ НУЖНО, в этом случае это&lt;br /&gt;
      предоставлено системе&lt;br /&gt;
&lt;br /&gt;
Скажем, хотим поместить в буфер обмена текст.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	//готовим данные&lt;br /&gt;
	//выделяем из кучи память для данных&lt;br /&gt;
	HANDLE hglbCopy = GlobalAlloc(GMEM_MOVEABLE,10);&lt;br /&gt;
	if(!hglbCopy)return;&lt;br /&gt;
&lt;br /&gt;
	//получаем указатель&lt;br /&gt;
	void* lpStr = GlobalLock(hglbCopy);&lt;br /&gt;
	if(!lpStr)return;&lt;br /&gt;
&lt;br /&gt;
	//заполняем данные&lt;br /&gt;
	strcpy((char*)lpStr,&amp;quot;my text&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	//освобождаем указатель&lt;br /&gt;
	GlobalUnlock(hglbCopy);&lt;br /&gt;
	lpStr=0;&lt;br /&gt;
&lt;br /&gt;
	//открываем буфер обмена&lt;br /&gt;
	OpenClipboard();&lt;br /&gt;
	//очищаем&lt;br /&gt;
	EmptyClipboard();&lt;br /&gt;
&lt;br /&gt;
	//текстовый формат&lt;br /&gt;
	SetClipboardData(CF_TEXT,hglbCopy);&lt;br /&gt;
&lt;br /&gt;
	//закрываем буфер&lt;br /&gt;
	CloseClipboard();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
2) извлечение из буфера обмена&lt;br /&gt;
&lt;br /&gt;
  1.Проверяем, что поддерживается нужный формат данных,&lt;br /&gt;
      вызывая IsClipboardFormatAvailable()&lt;br /&gt;
  2.Открываем буфер обмена, вызывая OpenClipboard();&lt;br /&gt;
  3.Достаём данные&lt;br /&gt;
   а.Получаем из буфера хендл требуемого формата,&lt;br /&gt;
      вызывая GetClipboardData()&lt;br /&gt;
    б.Получаем указатель на выделенную память, вызывая GlobalLock()&lt;br /&gt;
    в.Работаем с данными&lt;br /&gt;
    г.Освобождаем указатель, вызывая GlobalUnlock();&lt;br /&gt;
  4.Закрываем буфер, вызывая CloseClipboard();&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	//Проверяем, что поддерживается нужный формат данных,&lt;br /&gt;
	if(!IsClipboardFormatAvailable(CF_TEXT))return;&lt;br /&gt;
&lt;br /&gt;
	//открываем буфер обмена&lt;br /&gt;
	OpenClipboard();&lt;br /&gt;
&lt;br /&gt;
	//достаём данные&lt;br /&gt;
&lt;br /&gt;
	//текстовый формат&lt;br /&gt;
	HANDLE hglbCopy = GetClipboardData(CF_TEXT);&lt;br /&gt;
	if(!hglbCopy)return;&lt;br /&gt;
&lt;br /&gt;
	//получаем указатель&lt;br /&gt;
	void* lpStr = GlobalLock(hglbCopy);&lt;br /&gt;
	if(!lpStr)return;&lt;br /&gt;
&lt;br /&gt;
	//читаем данные&lt;br /&gt;
	char data[10];&lt;br /&gt;
	memmove(data,lpStr,sizeof(data));&lt;br /&gt;
&lt;br /&gt;
	//освобождаем указатель&lt;br /&gt;
	GlobalUnlock(hglbCopy);&lt;br /&gt;
	lpStr=0;&lt;br /&gt;
&lt;br /&gt;
	//закрываем буфер&lt;br /&gt;
	CloseClipboard();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Как получить полный путь к экзешнику из самой программы?===&lt;br /&gt;
В командную строку первым параметром система всегда передаёт заключённый в кавычки полный путь к файлу запущенной программы. Достаём путь таким образом:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
BOOL CMyApp::InitInstance()&lt;br /&gt;
{&lt;br /&gt;
	//добыча полного имени экзешника&lt;br /&gt;
	CString csFullExeName;&lt;br /&gt;
	{&lt;br /&gt;
		CString csAppName=GetCommandLine();&lt;br /&gt;
		csAppName.Delete(0,1);&lt;br /&gt;
		csAppName.Replace('\&amp;quot;','\0');&lt;br /&gt;
		csFullExeName=(const char*)csAppName;&lt;br /&gt;
	}&lt;br /&gt;
	//теперь csFullExeName - содержит искомый путь&lt;br /&gt;
&lt;br /&gt;
	//...&lt;br /&gt;
	//...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Каким способом exe файл может заменить самого себя? То есть, моя программа обновляется, например, через Internet, и хочет обновить свой exe-файл. Но так как он в данный момент запущен - это будет, естественно, запрещено. Как это можно проще всего сделать?===&lt;br /&gt;
Один из способов - сделать копию экзешника и из него обновиться&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define def_exeNAMEup	&amp;quot;c:\\myprog_update.exe&amp;quot;&lt;br /&gt;
#define def_exeNAMEdnld	&amp;quot;c:\\myprog_downloaded.exe&amp;quot;&lt;br /&gt;
#define def_keyUdate	&amp;quot;/update&amp;quot;&lt;br /&gt;
&lt;br /&gt;
void CTESTFAQApp::UpdateItself()&lt;br /&gt;
{&lt;br /&gt;
	//добыча полного имени экзешника&lt;br /&gt;
	CString csFullExeName;&lt;br /&gt;
	{&lt;br /&gt;
		CString csAppName=GetCommandLine();&lt;br /&gt;
		csAppName.Delete(0,1);&lt;br /&gt;
		csAppName.Replace('\&amp;quot;','\0');&lt;br /&gt;
		csFullExeName=(const char*)csAppName;&lt;br /&gt;
	}&lt;br /&gt;
	//теперь csFullExeName - содержит искомый путь&lt;br /&gt;
&lt;br /&gt;
	//делаем копию экзешника с другим именем&lt;br /&gt;
	CopyFile(csFullExeName,def_exeNAMEup,0);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	//передаём в параметры нового процесса ключ и путь к текущему файлу&lt;br /&gt;
	CString csParams=def_keyUdate;&lt;br /&gt;
	csParams+=&amp;quot; &amp;quot;;&lt;br /&gt;
	csParams+=csFullExeName;&lt;br /&gt;
&lt;br /&gt;
	//запускаем копию&lt;br /&gt;
	STARTUPINFO si;&lt;br /&gt;
	PROCESS_INFORMATION pi;&lt;br /&gt;
	ZeroMemory(&amp;amp;si,sizeof(si));&lt;br /&gt;
	si.cb = sizeof(si);&lt;br /&gt;
	ZeroMemory(&amp;amp;pi,sizeof(pi));&lt;br /&gt;
	if(CreateProcess(def_exeNAMEup,def_keyUdate,0,0,0,0,0,0,&amp;amp;si,&amp;amp;pi))&lt;br /&gt;
	{&lt;br /&gt;
		//завершаем текущий процесс&lt;br /&gt;
		ExitFromMyApp();&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void CTESTFAQApp::ExitFromMyApp()&lt;br /&gt;
{&lt;br /&gt;
	exit(0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
BOOL CTESTFAQApp::InitInstance()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
	//смотрим, не запустили ли для апдейта?&lt;br /&gt;
&lt;br /&gt;
	CString txt;&lt;br /&gt;
	txt=m_lpCmdLine;&lt;br /&gt;
	if(txt.Find(def_keyUdate)==0)&lt;br /&gt;
	{&lt;br /&gt;
		//делаем айдейт&lt;br /&gt;
		txt.Replace(def_keyUdate,&amp;quot;&amp;quot;);&lt;br /&gt;
		txt.TrimLeft();&lt;br /&gt;
&lt;br /&gt;
		CString csFullExeName=txt;&lt;br /&gt;
&lt;br /&gt;
		//берём откуда то уже скачанный файл обновления&lt;br /&gt;
		//...&lt;br /&gt;
		CString csFull_Downloaded_ExeName=def_exeNAMEdnld;&lt;br /&gt;
&lt;br /&gt;
		//копируем файл (обновляем старый то есть)&lt;br /&gt;
		CopyFile(csFull_Downloaded_ExeName,csFullExeName,0);&lt;br /&gt;
&lt;br /&gt;
		//запускаем обновлённого мученника&lt;br /&gt;
		STARTUPINFO si;&lt;br /&gt;
		PROCESS_INFORMATION pi;&lt;br /&gt;
		ZeroMemory(&amp;amp;si,sizeof(si));&lt;br /&gt;
		si.cb = sizeof(si);&lt;br /&gt;
		ZeroMemory(&amp;amp;pi,sizeof(pi));&lt;br /&gt;
		if(CreateProcess(csFullExeName,0,0,0,0,0,0,0,&amp;amp;si,&amp;amp;pi))&lt;br /&gt;
&lt;br /&gt;
		ExitFromMyApp();&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
	//...&lt;br /&gt;
	//...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Есть строка символов (страничка из Инета) в кодировке utf-8 (строка char*). Как мне ее получить в формате String или в char* в кодировке ANSI (cp 1251)?===&lt;br /&gt;
&lt;br /&gt;
Можно перевести строку из UTF8 в Unicode, затем из Unicode в 1251&lt;br /&gt;
&lt;br /&gt;
Ниже приведена структура, содержащая процедуры перекодирования,&lt;br /&gt;
а также процедуру с примером использования&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//описание структуры&lt;br /&gt;
struct coder&lt;br /&gt;
{&lt;br /&gt;
	//utf8-&amp;gt;unicode&lt;br /&gt;
	static wchar_t* utf8_to_unicode__dontForgetDeleteArr(const char *utf8_string)&lt;br /&gt;
	{&lt;br /&gt;
		wchar_t* pRes=0;&lt;br /&gt;
		int res_len=0;&lt;br /&gt;
&lt;br /&gt;
		//тест на возможность преобразования&lt;br /&gt;
		res_len=MultiByteToWideChar(CP_UTF8,0,utf8_string,-1,0,0);&lt;br /&gt;
		if(!res_len)return 0;&lt;br /&gt;
&lt;br /&gt;
		//выделяем память&lt;br /&gt;
		pRes = new wchar_t[res_len];&lt;br /&gt;
		if(!pRes)return 0;&lt;br /&gt;
&lt;br /&gt;
		//преобразование&lt;br /&gt;
		if(!MultiByteToWideChar(CP_UTF8,0,utf8_string,-1,pRes,res_len))&lt;br /&gt;
		{&lt;br /&gt;
			delete [] pRes;&lt;br /&gt;
			return 0;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		return pRes;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	//unicode-&amp;gt;1251&lt;br /&gt;
	static char * unicode_to_1251__dontForgetDeleteArr(const wchar_t *unicode_string)&lt;br /&gt;
	{&lt;br /&gt;
		char* pRes=0;&lt;br /&gt;
		int res_len=0;&lt;br /&gt;
&lt;br /&gt;
		//тест на возможность преобразования&lt;br /&gt;
		res_len = WideCharToMultiByte(1251,0,unicode_string,-1,0,0,0,0);&lt;br /&gt;
		if(!res_len)return 0;&lt;br /&gt;
&lt;br /&gt;
		//выделяем память&lt;br /&gt;
		pRes=new char[res_len];&lt;br /&gt;
		if(!pRes)return 0;&lt;br /&gt;
&lt;br /&gt;
		//преобразование&lt;br /&gt;
		if(!WideCharToMultiByte(1251,0,unicode_string,-1,pRes,res_len,0,0))&lt;br /&gt;
		{&lt;br /&gt;
			delete [] pRes;&lt;br /&gt;
			return 0;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		return pRes;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	//процедура с примером&lt;br /&gt;
	static void Example()&lt;br /&gt;
	{&lt;br /&gt;
		wchar_t* unicode_string=0;&lt;br /&gt;
		char* cp1251_string=0;&lt;br /&gt;
&lt;br /&gt;
		//исходный текст&lt;br /&gt;
		char utf8_string[] = &amp;quot;UTF-8 + СЂСѓСЃСЃРєРёР№ С‚РµРєСЃС‚&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
		for(;;)&lt;br /&gt;
		{&lt;br /&gt;
&lt;br /&gt;
			unicode_string=utf8_to_unicode__dontForgetDeleteArr(utf8_string);&lt;br /&gt;
			if(!unicode_string)&lt;br /&gt;
			{&lt;br /&gt;
				AfxMessageBox(&amp;quot;Не удалось конвертировать в unicode!&amp;quot;);&lt;br /&gt;
				break;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			cp1251_string = unicode_to_1251__dontForgetDeleteArr(unicode_string);&lt;br /&gt;
&lt;br /&gt;
			if(!cp1251_string)&lt;br /&gt;
			{&lt;br /&gt;
				AfxMessageBox(&amp;quot;Не удалось конвертировать из unicode!&amp;quot;);&lt;br /&gt;
				break;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			break;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		//cp1251_string - результат&lt;br /&gt;
		AfxMessageBox(cp1251_string);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
		//не забываем удалить массивы&lt;br /&gt;
		if(unicode_string)&lt;br /&gt;
		{&lt;br /&gt;
			delete [] unicode_string;&lt;br /&gt;
			unicode_string=0;&lt;br /&gt;
		}&lt;br /&gt;
		if(cp1251_string)&lt;br /&gt;
		{&lt;br /&gt;
			delete [] cp1251_string;&lt;br /&gt;
			cp1251_string=0;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
//вызов примера&lt;br /&gt;
coder::Example();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Как организовать взаимодействие программы на VC.net с Access-овской базой данных?===&lt;br /&gt;
Проще всего подключить ADO компоненты и сделать все на них.&lt;br /&gt;
Компоненты  ADO (ADODC,DATAGRID и т.п.) это ActiveX.&lt;br /&gt;
В редакторе ресурсов, во всплывающем меню, есть Insert ActiveX Control -&amp;gt; открывается список всех компоент,&lt;br /&gt;
зарегистрированых на машине. Нужно найти компоненты (Это компоненты от MS и они помечены (OLEDB)) и вставить их в диалог. Для того что бы иметь возможность управлять ими, нужно импортировать обертки для них, это делается при помощи ClassWisard, там есть импорт-&amp;gt;класс-&amp;gt;указать файл с компоентой (OSX).&lt;br /&gt;
Появляется список всех классов, объявленых внутри.&lt;br /&gt;
Проставляем галочки, нажимаем ОК.&lt;br /&gt;
&lt;br /&gt;
[[Category:FAQ]]&lt;/div&gt;</summary>
		<author><name>Mczim</name></author>	</entry>

	<entry>
		<id>https://wiki.shelek.ru/index.php?title=FAQ:WinAPI,_VCPP_Part_4&amp;diff=432</id>
		<title>FAQ:WinAPI, VCPP Part 4</title>
		<link rel="alternate" type="text/html" href="https://wiki.shelek.ru/index.php?title=FAQ:WinAPI,_VCPP_Part_4&amp;diff=432"/>
				<updated>2008-08-14T19:25:10Z</updated>
		
		<summary type="html">&lt;p&gt;Mczim: пробел перед запятой&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Как создавать всплывающие сообщения?===&lt;br /&gt;
Называется ето сообщение Balloon ToolTip. В МСДН-е есть статейка по этому поводу называется &amp;quot;Using ToolTip Controls&amp;quot;&lt;br /&gt;
[[Изображение:context_help.GIF]]&lt;br /&gt;
&lt;br /&gt;
Тематические ссылки:&lt;br /&gt;
http://www.codeproject.com/shell/LiviuBirjegaCode.asp&lt;br /&gt;
http://www.codeproject.com/useritems/wtlntray.asp&lt;br /&gt;
&lt;br /&gt;
Для получения сообщения того, как на картинке установите стиль&lt;br /&gt;
TTS_BALLOON==0x40&lt;br /&gt;
&lt;br /&gt;
и еще:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CToolTipCtrl::SetDelayTime(TTDT_AUTOPOP,10000);//время горения&lt;br /&gt;
CToolTipCtrl::SetDelayTime(TTDT_INITIAL,300);//через какое время появится на экране после наведения курсора&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Не могу понять, что делает функция ScrollWindow()===&lt;br /&gt;
К примеру, у вас есть уже нарисованное изображение на клиентской части окна, и нужно сделать скролинг этой части.&lt;br /&gt;
&lt;br /&gt;
Первый путь: Стереть что уже было нарисовано, и перерисовывать все заново с учетом скролинга.&lt;br /&gt;
&lt;br /&gt;
Второй путь: Передвинуть ту часть, которая останется в зоне видимости, и дорисовать недостаюшую часть. Вот ScrollWindow() и делает передвижение рисунка на заданное количество пикселей. Остаётся потом только дорисовать&lt;br /&gt;
&lt;br /&gt;
===В редакторе ресурсов на диалоге создаю элемент ComboBox. Почему во время работы программы список не выпадает, хотя клавишами &amp;quot;вверх&amp;quot; и &amp;quot;вниз&amp;quot; значения перебираются?===&lt;br /&gt;
Находясь в редакторе форм, щёлкните по стрелке комбобокса - и за нижний маркер растяни вниз - то есть задайте размер выпадающего&lt;br /&gt;
списка.&lt;br /&gt;
&lt;br /&gt;
===Internet Explorer: как поменять настройки программно?===&lt;br /&gt;
путь в реестре:&lt;br /&gt;
 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\AdvancedOptions\ (всякие настройки)&lt;br /&gt;
&lt;br /&gt;
===Как узнать, когда приложение уже готово к работе? (в этот момент мне нужно стартовать вспомогательный диалог для показа определенных значений)===&lt;br /&gt;
Можно попробовать переопределить функцию CWinApp::OnIdle. Эта функция вызывается всякий раз, когда в очереди сообщений&lt;br /&gt;
приложения нет больше сообщений. И при первом вызове OnIdle показывать вспомогательный диалог.&lt;br /&gt;
&lt;br /&gt;
===Как получить короткое и длинное имя файла?===&lt;br /&gt;
Например имеется путь к файлу:&lt;br /&gt;
   D:\program files\Microsoft Office\OFFICE11\winword.exe&lt;br /&gt;
надо привести его к виду:&lt;br /&gt;
   d:\PROGRA~1\MICROS~2\OFFICE11\WINWORD.EXE&lt;br /&gt;
и  наоборот,&lt;br /&gt;
использовать функции API&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
GetShortPathName(&lt;br /&gt;
	LPCSTR lpszLongPath,&lt;br /&gt;
	LPSTR  lpszShortPath,&lt;br /&gt;
	DWORD    cchBuffer);	//получить короткий путь&lt;br /&gt;
и&lt;br /&gt;
GetLongPathName(&lt;br /&gt;
	LPCSTR lpszShortPath,&lt;br /&gt;
	LPSTR  lpszLongPath,&lt;br /&gt;
	DWORD    cchBuffer);	//получить полный путь&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===В чём разница между сообщениями WM_MOVE и WM_MOVING?===&lt;br /&gt;
VM_MOVING - посылается окну, когда пользователь перемещает окно&lt;br /&gt;
&lt;br /&gt;
VM_MOVE - посылается окну, когда пользователь завершил перемещение&lt;br /&gt;
   окна (отпустил кнопку мыши)&lt;br /&gt;
&lt;br /&gt;
=== Как из программы определить каталог, в котором находится эта программа?===&lt;br /&gt;
Функция&lt;br /&gt;
 GetModuleFileName&lt;br /&gt;
возвращает абсолютное имя модуля.&lt;br /&gt;
&lt;br /&gt;
В MFC можно использовать переменную-член класса CWinApp, определённую как&lt;br /&gt;
 LPCTSTR m_pszExeName;&lt;br /&gt;
Вызывать так:&lt;br /&gt;
 AfxGetApp()-&amp;gt;m_pszExeName;&lt;br /&gt;
===Как получить полное имя пользователя и организации, то есть то, что на диалоге system properties (горячая кнопка [ Win ] + Break ) на закладке General перечисленно под пунктом Registred To? ===&lt;br /&gt;
в реестре&lt;br /&gt;
&lt;br /&gt;
тут&lt;br /&gt;
 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion&lt;br /&gt;
&lt;br /&gt;
или тут&lt;br /&gt;
 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion&lt;br /&gt;
&lt;br /&gt;
(зависит от версии Windows)&lt;br /&gt;
&lt;br /&gt;
===Мне надо в процессе выполнения программы динамичски создавать / удалять элементы (иконки и текстбоксы). Для этого мне надо при создании элемента задавать ID. Как определить первый свободный ИД, который можно использовать?===&lt;br /&gt;
Можно поступить так: Начать &amp;quot;поиск&amp;quot; ID со значения 1000 и, проверяя функцией GetDlgItem(), увеличивать значение на единицу до тех пор, пока не будет найден свободный ID.&lt;br /&gt;
&lt;br /&gt;
===Как изменить цвет рамки приложения? Пытаюсь закрашивать в OnPaint(), ничего не получается===&lt;br /&gt;
Это можно сделать, если перехватывать сообщение, которое идет на прорисовку не клиентской части окна WM_NCPAINT&lt;br /&gt;
&lt;br /&gt;
===Я запускаю экзешник при помощи ::ShellExecute(). Процедура тут же возвращает управление, а мне нужно дождаться, когда запущенный процесс завершится, а только потом продолжить дальнейшее выполнение программы. Как это сделать?===&lt;br /&gt;
Нужно использовать CreateProcess/WaitForSingeObject.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	STARTUPINFO	StartupInfo;&lt;br /&gt;
	PROCESS_INFORMATION ProcessInfo;&lt;br /&gt;
	DWORD dwRetValue;&lt;br /&gt;
	RtlZeroMemory(&amp;amp;StartupInfo, sizeof(StartupInfo));&lt;br /&gt;
	StartupInfo.cb = sizeof(StartupInfo);&lt;br /&gt;
	if(!CreateProcess(&lt;br /&gt;
		szApplicationName,&lt;br /&gt;
		szCommandLine,&lt;br /&gt;
		NULL, NULL, FALSE,&lt;br /&gt;
		NORMAL_PRIORITY_CLASS,&lt;br /&gt;
		NULL,&lt;br /&gt;
		szCurrentDirectory,&lt;br /&gt;
		&amp;amp;StartupInfo,&lt;br /&gt;
		&amp;amp;ProcessInfo))&lt;br /&gt;
	{&lt;br /&gt;
		//ошибка&lt;br /&gt;
		DWORD dwdErr=GetLastError(); //определяем ошибку&lt;br /&gt;
	}&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
		CloseHandle(ProcessInfo.hThread);&lt;br /&gt;
		WaitForSingleObject(ProcessInfo.hProcess, 30000);&lt;br /&gt;
		GetExitCodeProcess(ProcessInfo.hProcess, &amp;amp;dwRetValue);&lt;br /&gt;
		CloseHandle(ProcessInfo.hProcess);&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
В szApplicationName может быть либо полный путь к файлу, либо только имя файла,&lt;br /&gt;
в последнем случае файл будет искаться в текущем каталоге.&lt;br /&gt;
&lt;br /&gt;
szCommandLine может быть NULL, если не надо передавать командную строку&lt;br /&gt;
запускаемому процессу.&lt;br /&gt;
&lt;br /&gt;
szCurrentDirectory может быть NULL, тогда текущий каталог будет как у&lt;br /&gt;
родительского процесса.&lt;br /&gt;
===Как сменить иконку у диалога или мейнфрейма? (поставить свою иконку из ресурсов)===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	HICON m_hIcon;//&lt;br /&gt;
...&lt;br /&gt;
...&lt;br /&gt;
	HICON m_hIcon = AfxGetApp()-&amp;gt;LoadIcon(IDR_1);&lt;br /&gt;
	SetIcon(m_hIcon, TRUE);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
где&lt;br /&gt;
&lt;br /&gt;
IDR_1 - ИД иконки в ресурсах&lt;br /&gt;
&lt;br /&gt;
m_hIcon - хендл типа HICON (естественно - не временный, а, скажем, член класса)&lt;br /&gt;
&lt;br /&gt;
===Как во время долгих вычислений или в обработчике сообщения НЕМЕДЛЕННО перерисовать окно?===&lt;br /&gt;
скажем, находимся в неком обработчике диалога&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
MyDialog::f()&lt;br /&gt;
{&lt;br /&gt;
	...&lt;br /&gt;
	...&lt;br /&gt;
	//тут потребовалось перерисовать немедленно&lt;br /&gt;
	&lt;br /&gt;
	//помечаем всё окно &amp;quot;инвалидным&amp;quot; (требующим перерисовки)&lt;br /&gt;
	Invalidate(0);&lt;br /&gt;
	//перерисовываем &amp;quot;напрямую&amp;quot; посылая сообщение WM_PAINT в&lt;br /&gt;
	//оконную процедуру, минуя очередь сообщений&lt;br /&gt;
	UpdateWindow();&lt;br /&gt;
	...&lt;br /&gt;
	...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:FAQ]]&lt;/div&gt;</summary>
		<author><name>Mczim</name></author>	</entry>

	<entry>
		<id>https://wiki.shelek.ru/index.php?title=FAQ:WinAPI,_VCPP_Part_4&amp;diff=431</id>
		<title>FAQ:WinAPI, VCPP Part 4</title>
		<link rel="alternate" type="text/html" href="https://wiki.shelek.ru/index.php?title=FAQ:WinAPI,_VCPP_Part_4&amp;diff=431"/>
				<updated>2008-08-14T19:23:30Z</updated>
		
		<summary type="html">&lt;p&gt;Mczim: Это сделать, &amp;gt; Это можно сделать,&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Как создавать всплывающие сообщения?===&lt;br /&gt;
Называется ето сообщение Balloon ToolTip. В МСДН-е есть статейка по этому поводу называется &amp;quot;Using ToolTip Controls&amp;quot;&lt;br /&gt;
[[Изображение:context_help.GIF]]&lt;br /&gt;
&lt;br /&gt;
Тематические ссылки:&lt;br /&gt;
http://www.codeproject.com/shell/LiviuBirjegaCode.asp&lt;br /&gt;
http://www.codeproject.com/useritems/wtlntray.asp&lt;br /&gt;
&lt;br /&gt;
Для получения сообщения того, как на картинке установите стиль&lt;br /&gt;
TTS_BALLOON==0x40&lt;br /&gt;
&lt;br /&gt;
и еще:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CToolTipCtrl::SetDelayTime(TTDT_AUTOPOP,10000);//время горения&lt;br /&gt;
CToolTipCtrl::SetDelayTime(TTDT_INITIAL,300);//через какое время появится на экране после наведения курсора&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Не могу понять, что делает функция ScrollWindow()===&lt;br /&gt;
К примеру, у вас есть уже нарисованное изображение на клиентской части окна, и нужно сделать скролинг этой части.&lt;br /&gt;
&lt;br /&gt;
Первый путь: Стереть что уже было нарисовано, и перерисовывать все заново с учетом скролинга.&lt;br /&gt;
&lt;br /&gt;
Второй путь: Передвинуть ту часть, которая останется в зоне видимости, и дорисовать недостаюшую часть. Вот ScrollWindow() и делает передвижение рисунка на заданное количество пикселей. Остаётся потом только дорисовать&lt;br /&gt;
&lt;br /&gt;
===В редакторе ресурсов на диалоге создаю элемент ComboBox. Почему во время работы программы список не выпадает, хотя клавишами &amp;quot;вверх&amp;quot; и &amp;quot;вниз&amp;quot; значения перебираются?===&lt;br /&gt;
Находясь в редакторе форм, щёлкните по стрелке комбобокса - и за нижний маркер растяни вниз - то есть задайте размер выпадающего&lt;br /&gt;
списка.&lt;br /&gt;
&lt;br /&gt;
===Internet Explorer: как поменять настройки программно?===&lt;br /&gt;
путь в реестре:&lt;br /&gt;
 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\AdvancedOptions\ (всякие настройки)&lt;br /&gt;
&lt;br /&gt;
===Как узнать, когда приложение уже готово к работе? (в этот момент мне нужно стартовать вспомогательный диалог для показа определенных значений)===&lt;br /&gt;
Можно попробовать переопределить функцию CWinApp::OnIdle. Эта функция вызывается всякий раз, когда в очереди сообщений&lt;br /&gt;
приложения нет больше сообщений. И при первом вызове OnIdle показывать вспомогательный диалог.&lt;br /&gt;
&lt;br /&gt;
===Как получить короткое и длинное имя файла?===&lt;br /&gt;
Например имеется путь к файлу:&lt;br /&gt;
   D:\program files\Microsoft Office\OFFICE11\winword.exe&lt;br /&gt;
надо привести его к виду:&lt;br /&gt;
   d:\PROGRA~1\MICROS~2\OFFICE11\WINWORD.EXE&lt;br /&gt;
и  наоборот,&lt;br /&gt;
использовать функции API&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
GetShortPathName(&lt;br /&gt;
	LPCSTR lpszLongPath,&lt;br /&gt;
	LPSTR  lpszShortPath,&lt;br /&gt;
	DWORD    cchBuffer);	//получить короткий путь&lt;br /&gt;
и&lt;br /&gt;
GetLongPathName(&lt;br /&gt;
	LPCSTR lpszShortPath,&lt;br /&gt;
	LPSTR  lpszLongPath,&lt;br /&gt;
	DWORD    cchBuffer);	//получить полный путь&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===В чём разница между сообщениями WM_MOVE и WM_MOVING?===&lt;br /&gt;
VM_MOVING - посылается окну, когда пользователь перемещает окно&lt;br /&gt;
&lt;br /&gt;
VM_MOVE - посылается окну, когда пользователь завершил перемещение&lt;br /&gt;
   окна (отпустил кнопку мыши)&lt;br /&gt;
&lt;br /&gt;
=== Как из программы определить каталог, в котором находится эта программа?===&lt;br /&gt;
Функция&lt;br /&gt;
 GetModuleFileName&lt;br /&gt;
возвращает абсолютное имя модуля.&lt;br /&gt;
&lt;br /&gt;
В MFC можно использовать переменную-член класса CWinApp, определённую как&lt;br /&gt;
 LPCTSTR m_pszExeName;&lt;br /&gt;
Вызывать так:&lt;br /&gt;
 AfxGetApp()-&amp;gt;m_pszExeName;&lt;br /&gt;
===Как получить полное имя пользователя и организации, то есть то, что на диалоге system properties (горячая кнопка [ Win ] + Break ) на закладке General перечисленно под пунктом Registred To? ===&lt;br /&gt;
в реестре&lt;br /&gt;
&lt;br /&gt;
тут&lt;br /&gt;
 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion&lt;br /&gt;
&lt;br /&gt;
или тут&lt;br /&gt;
 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion&lt;br /&gt;
&lt;br /&gt;
(зависит от версии Windows)&lt;br /&gt;
&lt;br /&gt;
===Мне надо в процессе выполнения программы динамичски создавать / удалять элементы (иконки и текстбоксы). Для этого мне надо при создании элемента задавать ID. Как определить первый свободный ИД, который можно использовать?===&lt;br /&gt;
Можно поступить так: Начать &amp;quot;поиск&amp;quot; ID со значения 1000 и, проверяя функцией GetDlgItem(), увеличивать значение на единицу до тех пор, пока не будет найден свободный ID.&lt;br /&gt;
&lt;br /&gt;
===Как изменить цвет рамки приложения? Пытаюсь закрашивать в OnPaint(), ничего не получается===&lt;br /&gt;
Это можно сделать, если перехватывать сообщение, которое идет на прорисовку не клиентской части окна WM_NCPAINT&lt;br /&gt;
&lt;br /&gt;
===Я запускаю экзешник при помощи ::ShellExecute(). Процедура тут же возвращает управление, а мне нужно дождаться, когда запущенный процесс завершится, а только потом продолжить дальнейшее выполнение программы. Как это сделать?===&lt;br /&gt;
Нужно использовать CreateProcess/WaitForSingeObject.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	STARTUPINFO	StartupInfo;&lt;br /&gt;
	PROCESS_INFORMATION ProcessInfo;&lt;br /&gt;
	DWORD dwRetValue;&lt;br /&gt;
	RtlZeroMemory(&amp;amp;StartupInfo, sizeof(StartupInfo));&lt;br /&gt;
	StartupInfo.cb = sizeof(StartupInfo);&lt;br /&gt;
	if(!CreateProcess(&lt;br /&gt;
		szApplicationName,&lt;br /&gt;
		szCommandLine,&lt;br /&gt;
		NULL, NULL, FALSE,&lt;br /&gt;
		NORMAL_PRIORITY_CLASS,&lt;br /&gt;
		NULL,&lt;br /&gt;
		szCurrentDirectory,&lt;br /&gt;
		&amp;amp;StartupInfo,&lt;br /&gt;
		&amp;amp;ProcessInfo))&lt;br /&gt;
	{&lt;br /&gt;
		//ошибка&lt;br /&gt;
		DWORD dwdErr=GetLastError(); //определяем ошибку&lt;br /&gt;
	}&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
		CloseHandle(ProcessInfo.hThread);&lt;br /&gt;
		WaitForSingleObject(ProcessInfo.hProcess, 30000);&lt;br /&gt;
		GetExitCodeProcess(ProcessInfo.hProcess, &amp;amp;dwRetValue);&lt;br /&gt;
		CloseHandle(ProcessInfo.hProcess);&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
В szApplicationName может быть либо полный путь к файлу, либо только имя файла,&lt;br /&gt;
в последнем случае файл будет искаться в текущем каталоге.&lt;br /&gt;
&lt;br /&gt;
szCommandLine может быть NULL, если не надо передавать командную строку&lt;br /&gt;
запускаемому процессу.&lt;br /&gt;
&lt;br /&gt;
szCurrentDirectory может быть NULL, тогда текущий каталог будет как у&lt;br /&gt;
родительского процесса.&lt;br /&gt;
===Как сменить иконку у диалога или мейнфрейма? (поставить свою иконку из ресурсов)===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	HICON m_hIcon;//&lt;br /&gt;
...&lt;br /&gt;
...&lt;br /&gt;
	HICON m_hIcon = AfxGetApp()-&amp;gt;LoadIcon(IDR_1);&lt;br /&gt;
	SetIcon(m_hIcon, TRUE);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
где&lt;br /&gt;
&lt;br /&gt;
IDR_1 - ИД иконки в ресурсах&lt;br /&gt;
&lt;br /&gt;
m_hIcon - хендл типа HICON (естественно - не временный, а, скажем, член класса)&lt;br /&gt;
&lt;br /&gt;
===Как во время долгих вычислений или в обработчике сообщения НЕМЕДЛЕННО перерисовать окно?===&lt;br /&gt;
скажем , находимся в неком обработчике диалога&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
MyDialog::f()&lt;br /&gt;
{&lt;br /&gt;
	...&lt;br /&gt;
	...&lt;br /&gt;
	//тут потребовалось перерисовать немедленно&lt;br /&gt;
	&lt;br /&gt;
	//помечаем всё окно &amp;quot;инвалидным&amp;quot; (требующим перерисовки)&lt;br /&gt;
	Invalidate(0);&lt;br /&gt;
	//перерисовываем &amp;quot;напрямую&amp;quot; посылая сообщение WM_PAINT в&lt;br /&gt;
	//оконную процедуру, минуя очередь сообщений&lt;br /&gt;
	UpdateWindow();&lt;br /&gt;
	...&lt;br /&gt;
	...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:FAQ]]&lt;/div&gt;</summary>
		<author><name>Mczim</name></author>	</entry>

	<entry>
		<id>https://wiki.shelek.ru/index.php?title=FAQ:WinAPI,_VCPP_Part_4&amp;diff=430</id>
		<title>FAQ:WinAPI, VCPP Part 4</title>
		<link rel="alternate" type="text/html" href="https://wiki.shelek.ru/index.php?title=FAQ:WinAPI,_VCPP_Part_4&amp;diff=430"/>
				<updated>2008-08-14T19:22:16Z</updated>
		
		<summary type="html">&lt;p&gt;Mczim: пробел перед знаком вопроса в заголовке&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Как создавать всплывающие сообщения?===&lt;br /&gt;
Называется ето сообщение Balloon ToolTip. В МСДН-е есть статейка по этому поводу называется &amp;quot;Using ToolTip Controls&amp;quot;&lt;br /&gt;
[[Изображение:context_help.GIF]]&lt;br /&gt;
&lt;br /&gt;
Тематические ссылки:&lt;br /&gt;
http://www.codeproject.com/shell/LiviuBirjegaCode.asp&lt;br /&gt;
http://www.codeproject.com/useritems/wtlntray.asp&lt;br /&gt;
&lt;br /&gt;
Для получения сообщения того, как на картинке установите стиль&lt;br /&gt;
TTS_BALLOON==0x40&lt;br /&gt;
&lt;br /&gt;
и еще:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CToolTipCtrl::SetDelayTime(TTDT_AUTOPOP,10000);//время горения&lt;br /&gt;
CToolTipCtrl::SetDelayTime(TTDT_INITIAL,300);//через какое время появится на экране после наведения курсора&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Не могу понять, что делает функция ScrollWindow()===&lt;br /&gt;
К примеру, у вас есть уже нарисованное изображение на клиентской части окна, и нужно сделать скролинг этой части.&lt;br /&gt;
&lt;br /&gt;
Первый путь: Стереть что уже было нарисовано, и перерисовывать все заново с учетом скролинга.&lt;br /&gt;
&lt;br /&gt;
Второй путь: Передвинуть ту часть, которая останется в зоне видимости, и дорисовать недостаюшую часть. Вот ScrollWindow() и делает передвижение рисунка на заданное количество пикселей. Остаётся потом только дорисовать&lt;br /&gt;
&lt;br /&gt;
===В редакторе ресурсов на диалоге создаю элемент ComboBox. Почему во время работы программы список не выпадает, хотя клавишами &amp;quot;вверх&amp;quot; и &amp;quot;вниз&amp;quot; значения перебираются?===&lt;br /&gt;
Находясь в редакторе форм, щёлкните по стрелке комбобокса - и за нижний маркер растяни вниз - то есть задайте размер выпадающего&lt;br /&gt;
списка.&lt;br /&gt;
&lt;br /&gt;
===Internet Explorer: как поменять настройки программно?===&lt;br /&gt;
путь в реестре:&lt;br /&gt;
 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\AdvancedOptions\ (всякие настройки)&lt;br /&gt;
&lt;br /&gt;
===Как узнать, когда приложение уже готово к работе? (в этот момент мне нужно стартовать вспомогательный диалог для показа определенных значений)===&lt;br /&gt;
Можно попробовать переопределить функцию CWinApp::OnIdle. Эта функция вызывается всякий раз, когда в очереди сообщений&lt;br /&gt;
приложения нет больше сообщений. И при первом вызове OnIdle показывать вспомогательный диалог.&lt;br /&gt;
&lt;br /&gt;
===Как получить короткое и длинное имя файла?===&lt;br /&gt;
Например имеется путь к файлу:&lt;br /&gt;
   D:\program files\Microsoft Office\OFFICE11\winword.exe&lt;br /&gt;
надо привести его к виду:&lt;br /&gt;
   d:\PROGRA~1\MICROS~2\OFFICE11\WINWORD.EXE&lt;br /&gt;
и  наоборот,&lt;br /&gt;
использовать функции API&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
GetShortPathName(&lt;br /&gt;
	LPCSTR lpszLongPath,&lt;br /&gt;
	LPSTR  lpszShortPath,&lt;br /&gt;
	DWORD    cchBuffer);	//получить короткий путь&lt;br /&gt;
и&lt;br /&gt;
GetLongPathName(&lt;br /&gt;
	LPCSTR lpszShortPath,&lt;br /&gt;
	LPSTR  lpszLongPath,&lt;br /&gt;
	DWORD    cchBuffer);	//получить полный путь&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===В чём разница между сообщениями WM_MOVE и WM_MOVING?===&lt;br /&gt;
VM_MOVING - посылается окну, когда пользователь перемещает окно&lt;br /&gt;
&lt;br /&gt;
VM_MOVE - посылается окну, когда пользователь завершил перемещение&lt;br /&gt;
   окна (отпустил кнопку мыши)&lt;br /&gt;
&lt;br /&gt;
=== Как из программы определить каталог, в котором находится эта программа?===&lt;br /&gt;
Функция&lt;br /&gt;
 GetModuleFileName&lt;br /&gt;
возвращает абсолютное имя модуля.&lt;br /&gt;
&lt;br /&gt;
В MFC можно использовать переменную-член класса CWinApp, определённую как&lt;br /&gt;
 LPCTSTR m_pszExeName;&lt;br /&gt;
Вызывать так:&lt;br /&gt;
 AfxGetApp()-&amp;gt;m_pszExeName;&lt;br /&gt;
===Как получить полное имя пользователя и организации, то есть то, что на диалоге system properties (горячая кнопка [ Win ] + Break ) на закладке General перечисленно под пунктом Registred To? ===&lt;br /&gt;
в реестре&lt;br /&gt;
&lt;br /&gt;
тут&lt;br /&gt;
 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion&lt;br /&gt;
&lt;br /&gt;
или тут&lt;br /&gt;
 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion&lt;br /&gt;
&lt;br /&gt;
(зависит от версии Windows)&lt;br /&gt;
&lt;br /&gt;
===Мне надо в процессе выполнения программы динамичски создавать / удалять элементы (иконки и текстбоксы). Для этого мне надо при создании элемента задавать ID. Как определить первый свободный ИД, который можно использовать?===&lt;br /&gt;
Можно поступить так: Начать &amp;quot;поиск&amp;quot; ID со значения 1000 и, проверяя функцией GetDlgItem(), увеличивать значение на единицу до тех пор, пока не будет найден свободный ID.&lt;br /&gt;
&lt;br /&gt;
===Как изменить цвет рамки приложения? Пытаюсь закрашивать в OnPaint(), ничего не получается===&lt;br /&gt;
Это сделать, если перехватывать сообщение, которое идет на прорисовку не клиентской части окна WM_NCPAINT&lt;br /&gt;
===Я запускаю экзешник при помощи ::ShellExecute(). Процедура тут же возвращает управление, а мне нужно дождаться, когда запущенный процесс завершится, а только потом продолжить дальнейшее выполнение программы. Как это сделать?===&lt;br /&gt;
Нужно использовать CreateProcess/WaitForSingeObject.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	STARTUPINFO	StartupInfo;&lt;br /&gt;
	PROCESS_INFORMATION ProcessInfo;&lt;br /&gt;
	DWORD dwRetValue;&lt;br /&gt;
	RtlZeroMemory(&amp;amp;StartupInfo, sizeof(StartupInfo));&lt;br /&gt;
	StartupInfo.cb = sizeof(StartupInfo);&lt;br /&gt;
	if(!CreateProcess(&lt;br /&gt;
		szApplicationName,&lt;br /&gt;
		szCommandLine,&lt;br /&gt;
		NULL, NULL, FALSE,&lt;br /&gt;
		NORMAL_PRIORITY_CLASS,&lt;br /&gt;
		NULL,&lt;br /&gt;
		szCurrentDirectory,&lt;br /&gt;
		&amp;amp;StartupInfo,&lt;br /&gt;
		&amp;amp;ProcessInfo))&lt;br /&gt;
	{&lt;br /&gt;
		//ошибка&lt;br /&gt;
		DWORD dwdErr=GetLastError(); //определяем ошибку&lt;br /&gt;
	}&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
		CloseHandle(ProcessInfo.hThread);&lt;br /&gt;
		WaitForSingleObject(ProcessInfo.hProcess, 30000);&lt;br /&gt;
		GetExitCodeProcess(ProcessInfo.hProcess, &amp;amp;dwRetValue);&lt;br /&gt;
		CloseHandle(ProcessInfo.hProcess);&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
В szApplicationName может быть либо полный путь к файлу, либо только имя файла,&lt;br /&gt;
в последнем случае файл будет искаться в текущем каталоге.&lt;br /&gt;
&lt;br /&gt;
szCommandLine может быть NULL, если не надо передавать командную строку&lt;br /&gt;
запускаемому процессу.&lt;br /&gt;
&lt;br /&gt;
szCurrentDirectory может быть NULL, тогда текущий каталог будет как у&lt;br /&gt;
родительского процесса.&lt;br /&gt;
===Как сменить иконку у диалога или мейнфрейма? (поставить свою иконку из ресурсов)===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	HICON m_hIcon;//&lt;br /&gt;
...&lt;br /&gt;
...&lt;br /&gt;
	HICON m_hIcon = AfxGetApp()-&amp;gt;LoadIcon(IDR_1);&lt;br /&gt;
	SetIcon(m_hIcon, TRUE);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
где&lt;br /&gt;
&lt;br /&gt;
IDR_1 - ИД иконки в ресурсах&lt;br /&gt;
&lt;br /&gt;
m_hIcon - хендл типа HICON (естественно - не временный, а, скажем, член класса)&lt;br /&gt;
&lt;br /&gt;
===Как во время долгих вычислений или в обработчике сообщения НЕМЕДЛЕННО перерисовать окно?===&lt;br /&gt;
скажем , находимся в неком обработчике диалога&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
MyDialog::f()&lt;br /&gt;
{&lt;br /&gt;
	...&lt;br /&gt;
	...&lt;br /&gt;
	//тут потребовалось перерисовать немедленно&lt;br /&gt;
	&lt;br /&gt;
	//помечаем всё окно &amp;quot;инвалидным&amp;quot; (требующим перерисовки)&lt;br /&gt;
	Invalidate(0);&lt;br /&gt;
	//перерисовываем &amp;quot;напрямую&amp;quot; посылая сообщение WM_PAINT в&lt;br /&gt;
	//оконную процедуру, минуя очередь сообщений&lt;br /&gt;
	UpdateWindow();&lt;br /&gt;
	...&lt;br /&gt;
	...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:FAQ]]&lt;/div&gt;</summary>
		<author><name>Mczim</name></author>	</entry>

	<entry>
		<id>https://wiki.shelek.ru/index.php?title=FAQ:WinAPI,_VCPP_Part_4&amp;diff=429</id>
		<title>FAQ:WinAPI, VCPP Part 4</title>
		<link rel="alternate" type="text/html" href="https://wiki.shelek.ru/index.php?title=FAQ:WinAPI,_VCPP_Part_4&amp;diff=429"/>
				<updated>2008-08-14T19:21:28Z</updated>
		
		<summary type="html">&lt;p&gt;Mczim: пробел перед знаком вопроса в заголовке&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Как создавать всплывающие сообщения?===&lt;br /&gt;
Называется ето сообщение Balloon ToolTip. В МСДН-е есть статейка по этому поводу называется &amp;quot;Using ToolTip Controls&amp;quot;&lt;br /&gt;
[[Изображение:context_help.GIF]]&lt;br /&gt;
&lt;br /&gt;
Тематические ссылки:&lt;br /&gt;
http://www.codeproject.com/shell/LiviuBirjegaCode.asp&lt;br /&gt;
http://www.codeproject.com/useritems/wtlntray.asp&lt;br /&gt;
&lt;br /&gt;
Для получения сообщения того, как на картинке установите стиль&lt;br /&gt;
TTS_BALLOON==0x40&lt;br /&gt;
&lt;br /&gt;
и еще:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CToolTipCtrl::SetDelayTime(TTDT_AUTOPOP,10000);//время горения&lt;br /&gt;
CToolTipCtrl::SetDelayTime(TTDT_INITIAL,300);//через какое время появится на экране после наведения курсора&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Не могу понять, что делает функция ScrollWindow()===&lt;br /&gt;
К примеру, у вас есть уже нарисованное изображение на клиентской части окна, и нужно сделать скролинг этой части.&lt;br /&gt;
&lt;br /&gt;
Первый путь: Стереть что уже было нарисовано, и перерисовывать все заново с учетом скролинга.&lt;br /&gt;
&lt;br /&gt;
Второй путь: Передвинуть ту часть, которая останется в зоне видимости, и дорисовать недостаюшую часть. Вот ScrollWindow() и делает передвижение рисунка на заданное количество пикселей. Остаётся потом только дорисовать&lt;br /&gt;
&lt;br /&gt;
===В редакторе ресурсов на диалоге создаю элемент ComboBox. Почему во время работы программы список не выпадает, хотя клавишами &amp;quot;вверх&amp;quot; и &amp;quot;вниз&amp;quot; значения перебираются?===&lt;br /&gt;
Находясь в редакторе форм, щёлкните по стрелке комбобокса - и за нижний маркер растяни вниз - то есть задайте размер выпадающего&lt;br /&gt;
списка.&lt;br /&gt;
&lt;br /&gt;
===Internet Explorer: как поменять настройки программно?===&lt;br /&gt;
путь в реестре:&lt;br /&gt;
 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\AdvancedOptions\ (всякие настройки)&lt;br /&gt;
&lt;br /&gt;
===Как узнать, когда приложение уже готово к работе? (в этот момент мне нужно стартовать вспомогательный диалог для показа определенных значений)===&lt;br /&gt;
Можно попробовать переопределить функцию CWinApp::OnIdle. Эта функция вызывается всякий раз, когда в очереди сообщений&lt;br /&gt;
приложения нет больше сообщений. И при первом вызове OnIdle показывать вспомогательный диалог.&lt;br /&gt;
&lt;br /&gt;
===Как получить короткое и длинное имя файла?===&lt;br /&gt;
Например имеется путь к файлу:&lt;br /&gt;
   D:\program files\Microsoft Office\OFFICE11\winword.exe&lt;br /&gt;
надо привести его к виду:&lt;br /&gt;
   d:\PROGRA~1\MICROS~2\OFFICE11\WINWORD.EXE&lt;br /&gt;
и  наоборот,&lt;br /&gt;
использовать функции API&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
GetShortPathName(&lt;br /&gt;
	LPCSTR lpszLongPath,&lt;br /&gt;
	LPSTR  lpszShortPath,&lt;br /&gt;
	DWORD    cchBuffer);	//получить короткий путь&lt;br /&gt;
и&lt;br /&gt;
GetLongPathName(&lt;br /&gt;
	LPCSTR lpszShortPath,&lt;br /&gt;
	LPSTR  lpszLongPath,&lt;br /&gt;
	DWORD    cchBuffer);	//получить полный путь&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===В чём разница между сообщениями WM_MOVE и WM_MOVING?===&lt;br /&gt;
VM_MOVING - посылается окну, когда пользователь перемещает окно&lt;br /&gt;
&lt;br /&gt;
VM_MOVE - посылается окну, когда пользователь завершил перемещение&lt;br /&gt;
   окна (отпустил кнопку мыши)&lt;br /&gt;
&lt;br /&gt;
=== Как из программы определить каталог, в котором находится эта программа?===&lt;br /&gt;
Функция&lt;br /&gt;
 GetModuleFileName&lt;br /&gt;
возвращает абсолютное имя модуля.&lt;br /&gt;
&lt;br /&gt;
В MFC можно использовать переменную-член класса CWinApp, определённую как&lt;br /&gt;
 LPCTSTR m_pszExeName;&lt;br /&gt;
Вызывать так:&lt;br /&gt;
 AfxGetApp()-&amp;gt;m_pszExeName;&lt;br /&gt;
===Как получить полное имя пользователя и организации, то есть то, что на диалоге system properties (горячая кнопка [ Win ] + Break ) на закладке General перечисленно под пунктом Registred To? ===&lt;br /&gt;
в реестре&lt;br /&gt;
&lt;br /&gt;
тут&lt;br /&gt;
 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion&lt;br /&gt;
&lt;br /&gt;
или тут&lt;br /&gt;
 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion&lt;br /&gt;
&lt;br /&gt;
(зависит от версии Windows)&lt;br /&gt;
&lt;br /&gt;
===Мне надо в процессе выполнения программы динамичски создавать / удалять элементы (иконки и текстбоксы). Для этого мне надо при создании элемента задавать ID. Как определить первый свободный ИД, который можно использовать ?===&lt;br /&gt;
Можно поступить так: Начать &amp;quot;поиск&amp;quot; ID со значения 1000 и, проверяя функцией GetDlgItem(), увеличивать значение на единицу до тех пор, пока не будет найден свободный ID.&lt;br /&gt;
===Как изменить цвет рамки приложения? Пытаюсь закрашивать в OnPaint(), ничего не получается===&lt;br /&gt;
Это сделать, если перехватывать сообщение, которое идет на прорисовку не клиентской части окна WM_NCPAINT&lt;br /&gt;
===Я запускаю экзешник при помощи ::ShellExecute(). Процедура тут же возвращает управление, а мне нужно дождаться, когда запущенный процесс завершится, а только потом продолжить дальнейшее выполнение программы. Как это сделать?===&lt;br /&gt;
Нужно использовать CreateProcess/WaitForSingeObject.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	STARTUPINFO	StartupInfo;&lt;br /&gt;
	PROCESS_INFORMATION ProcessInfo;&lt;br /&gt;
	DWORD dwRetValue;&lt;br /&gt;
	RtlZeroMemory(&amp;amp;StartupInfo, sizeof(StartupInfo));&lt;br /&gt;
	StartupInfo.cb = sizeof(StartupInfo);&lt;br /&gt;
	if(!CreateProcess(&lt;br /&gt;
		szApplicationName,&lt;br /&gt;
		szCommandLine,&lt;br /&gt;
		NULL, NULL, FALSE,&lt;br /&gt;
		NORMAL_PRIORITY_CLASS,&lt;br /&gt;
		NULL,&lt;br /&gt;
		szCurrentDirectory,&lt;br /&gt;
		&amp;amp;StartupInfo,&lt;br /&gt;
		&amp;amp;ProcessInfo))&lt;br /&gt;
	{&lt;br /&gt;
		//ошибка&lt;br /&gt;
		DWORD dwdErr=GetLastError(); //определяем ошибку&lt;br /&gt;
	}&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
		CloseHandle(ProcessInfo.hThread);&lt;br /&gt;
		WaitForSingleObject(ProcessInfo.hProcess, 30000);&lt;br /&gt;
		GetExitCodeProcess(ProcessInfo.hProcess, &amp;amp;dwRetValue);&lt;br /&gt;
		CloseHandle(ProcessInfo.hProcess);&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
В szApplicationName может быть либо полный путь к файлу, либо только имя файла,&lt;br /&gt;
в последнем случае файл будет искаться в текущем каталоге.&lt;br /&gt;
&lt;br /&gt;
szCommandLine может быть NULL, если не надо передавать командную строку&lt;br /&gt;
запускаемому процессу.&lt;br /&gt;
&lt;br /&gt;
szCurrentDirectory может быть NULL, тогда текущий каталог будет как у&lt;br /&gt;
родительского процесса.&lt;br /&gt;
===Как сменить иконку у диалога или мейнфрейма? (поставить свою иконку из ресурсов)===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	HICON m_hIcon;//&lt;br /&gt;
...&lt;br /&gt;
...&lt;br /&gt;
	HICON m_hIcon = AfxGetApp()-&amp;gt;LoadIcon(IDR_1);&lt;br /&gt;
	SetIcon(m_hIcon, TRUE);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
где&lt;br /&gt;
&lt;br /&gt;
IDR_1 - ИД иконки в ресурсах&lt;br /&gt;
&lt;br /&gt;
m_hIcon - хендл типа HICON (естественно - не временный, а, скажем, член класса)&lt;br /&gt;
&lt;br /&gt;
===Как во время долгих вычислений или в обработчике сообщения НЕМЕДЛЕННО перерисовать окно?===&lt;br /&gt;
скажем , находимся в неком обработчике диалога&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
MyDialog::f()&lt;br /&gt;
{&lt;br /&gt;
	...&lt;br /&gt;
	...&lt;br /&gt;
	//тут потребовалось перерисовать немедленно&lt;br /&gt;
	&lt;br /&gt;
	//помечаем всё окно &amp;quot;инвалидным&amp;quot; (требующим перерисовки)&lt;br /&gt;
	Invalidate(0);&lt;br /&gt;
	//перерисовываем &amp;quot;напрямую&amp;quot; посылая сообщение WM_PAINT в&lt;br /&gt;
	//оконную процедуру, минуя очередь сообщений&lt;br /&gt;
	UpdateWindow();&lt;br /&gt;
	...&lt;br /&gt;
	...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:FAQ]]&lt;/div&gt;</summary>
		<author><name>Mczim</name></author>	</entry>

	<entry>
		<id>https://wiki.shelek.ru/index.php?title=FAQ:WinAPI,_VCPP_Part_4&amp;diff=428</id>
		<title>FAQ:WinAPI, VCPP Part 4</title>
		<link rel="alternate" type="text/html" href="https://wiki.shelek.ru/index.php?title=FAQ:WinAPI,_VCPP_Part_4&amp;diff=428"/>
				<updated>2008-08-14T19:20:35Z</updated>
		
		<summary type="html">&lt;p&gt;Mczim: пробел перед знаком вопроса в заголовке&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Как создавать всплывающие сообщения?===&lt;br /&gt;
Называется ето сообщение Balloon ToolTip. В МСДН-е есть статейка по этому поводу называется &amp;quot;Using ToolTip Controls&amp;quot;&lt;br /&gt;
[[Изображение:context_help.GIF]]&lt;br /&gt;
&lt;br /&gt;
Тематические ссылки:&lt;br /&gt;
http://www.codeproject.com/shell/LiviuBirjegaCode.asp&lt;br /&gt;
http://www.codeproject.com/useritems/wtlntray.asp&lt;br /&gt;
&lt;br /&gt;
Для получения сообщения того, как на картинке установите стиль&lt;br /&gt;
TTS_BALLOON==0x40&lt;br /&gt;
&lt;br /&gt;
и еще:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CToolTipCtrl::SetDelayTime(TTDT_AUTOPOP,10000);//время горения&lt;br /&gt;
CToolTipCtrl::SetDelayTime(TTDT_INITIAL,300);//через какое время появится на экране после наведения курсора&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Не могу понять, что делает функция ScrollWindow()===&lt;br /&gt;
К примеру, у вас есть уже нарисованное изображение на клиентской части окна, и нужно сделать скролинг этой части.&lt;br /&gt;
&lt;br /&gt;
Первый путь: Стереть что уже было нарисовано, и перерисовывать все заново с учетом скролинга.&lt;br /&gt;
&lt;br /&gt;
Второй путь: Передвинуть ту часть, которая останется в зоне видимости, и дорисовать недостаюшую часть. Вот ScrollWindow() и делает передвижение рисунка на заданное количество пикселей. Остаётся потом только дорисовать&lt;br /&gt;
&lt;br /&gt;
===В редакторе ресурсов на диалоге создаю элемент ComboBox. Почему во время работы программы список не выпадает, хотя клавишами &amp;quot;вверх&amp;quot; и &amp;quot;вниз&amp;quot; значения перебираются?===&lt;br /&gt;
Находясь в редакторе форм, щёлкните по стрелке комбобокса - и за нижний маркер растяни вниз - то есть задайте размер выпадающего&lt;br /&gt;
списка.&lt;br /&gt;
&lt;br /&gt;
===Internet Explorer: как поменять настройки программно?===&lt;br /&gt;
путь в реестре:&lt;br /&gt;
 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\AdvancedOptions\ (всякие настройки)&lt;br /&gt;
&lt;br /&gt;
===Как узнать, когда приложение уже готово к работе? (в этот момент мне нужно стартовать вспомогательный диалог для показа определенных значений)===&lt;br /&gt;
Можно попробовать переопределить функцию CWinApp::OnIdle. Эта функция вызывается всякий раз, когда в очереди сообщений&lt;br /&gt;
приложения нет больше сообщений. И при первом вызове OnIdle показывать вспомогательный диалог.&lt;br /&gt;
&lt;br /&gt;
===Как получить короткое и длинное имя файла?===&lt;br /&gt;
Например имеется путь к файлу:&lt;br /&gt;
   D:\program files\Microsoft Office\OFFICE11\winword.exe&lt;br /&gt;
надо привести его к виду:&lt;br /&gt;
   d:\PROGRA~1\MICROS~2\OFFICE11\WINWORD.EXE&lt;br /&gt;
и  наоборот,&lt;br /&gt;
использовать функции API&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
GetShortPathName(&lt;br /&gt;
	LPCSTR lpszLongPath,&lt;br /&gt;
	LPSTR  lpszShortPath,&lt;br /&gt;
	DWORD    cchBuffer);	//получить короткий путь&lt;br /&gt;
и&lt;br /&gt;
GetLongPathName(&lt;br /&gt;
	LPCSTR lpszShortPath,&lt;br /&gt;
	LPSTR  lpszLongPath,&lt;br /&gt;
	DWORD    cchBuffer);	//получить полный путь&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===В чём разница между сообщениями WM_MOVE и WM_MOVING?===&lt;br /&gt;
VM_MOVING - посылается окну, когда пользователь перемещает окно&lt;br /&gt;
&lt;br /&gt;
VM_MOVE - посылается окну, когда пользователь завершил перемещение&lt;br /&gt;
   окна (отпустил кнопку мыши)&lt;br /&gt;
&lt;br /&gt;
=== Как из программы определить каталог, в котором находится эта программа?===&lt;br /&gt;
Функция&lt;br /&gt;
 GetModuleFileName&lt;br /&gt;
возвращает абсолютное имя модуля.&lt;br /&gt;
&lt;br /&gt;
В MFC можно использовать переменную-член класса CWinApp, определённую как&lt;br /&gt;
 LPCTSTR m_pszExeName;&lt;br /&gt;
Вызывать так:&lt;br /&gt;
 AfxGetApp()-&amp;gt;m_pszExeName;&lt;br /&gt;
===Как получить полное имя пользователя и организации, то есть то, что на диалоге system properties (горячая кнопка [ Win ] + Break ) на закладке General перечисленно под пунктом Registred To ? ===&lt;br /&gt;
в реестре&lt;br /&gt;
&lt;br /&gt;
тут&lt;br /&gt;
 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion&lt;br /&gt;
&lt;br /&gt;
или тут&lt;br /&gt;
 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion&lt;br /&gt;
&lt;br /&gt;
(зависит от версии Windows)&lt;br /&gt;
===Мне надо в процессе выполнения программы динамичски создавать / удалять элементы (иконки и текстбоксы). Для этого мне надо при создании элемента задавать ID. Как определить первый свободный ИД, который можно использовать ?===&lt;br /&gt;
Можно поступить так: Начать &amp;quot;поиск&amp;quot; ID со значения 1000 и, проверяя функцией GetDlgItem(), увеличивать значение на единицу до тех пор, пока не будет найден свободный ID.&lt;br /&gt;
===Как изменить цвет рамки приложения? Пытаюсь закрашивать в OnPaint(), ничего не получается===&lt;br /&gt;
Это сделать, если перехватывать сообщение, которое идет на прорисовку не клиентской части окна WM_NCPAINT&lt;br /&gt;
===Я запускаю экзешник при помощи ::ShellExecute(). Процедура тут же возвращает управление, а мне нужно дождаться, когда запущенный процесс завершится, а только потом продолжить дальнейшее выполнение программы. Как это сделать?===&lt;br /&gt;
Нужно использовать CreateProcess/WaitForSingeObject.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	STARTUPINFO	StartupInfo;&lt;br /&gt;
	PROCESS_INFORMATION ProcessInfo;&lt;br /&gt;
	DWORD dwRetValue;&lt;br /&gt;
	RtlZeroMemory(&amp;amp;StartupInfo, sizeof(StartupInfo));&lt;br /&gt;
	StartupInfo.cb = sizeof(StartupInfo);&lt;br /&gt;
	if(!CreateProcess(&lt;br /&gt;
		szApplicationName,&lt;br /&gt;
		szCommandLine,&lt;br /&gt;
		NULL, NULL, FALSE,&lt;br /&gt;
		NORMAL_PRIORITY_CLASS,&lt;br /&gt;
		NULL,&lt;br /&gt;
		szCurrentDirectory,&lt;br /&gt;
		&amp;amp;StartupInfo,&lt;br /&gt;
		&amp;amp;ProcessInfo))&lt;br /&gt;
	{&lt;br /&gt;
		//ошибка&lt;br /&gt;
		DWORD dwdErr=GetLastError(); //определяем ошибку&lt;br /&gt;
	}&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
		CloseHandle(ProcessInfo.hThread);&lt;br /&gt;
		WaitForSingleObject(ProcessInfo.hProcess, 30000);&lt;br /&gt;
		GetExitCodeProcess(ProcessInfo.hProcess, &amp;amp;dwRetValue);&lt;br /&gt;
		CloseHandle(ProcessInfo.hProcess);&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
В szApplicationName может быть либо полный путь к файлу, либо только имя файла,&lt;br /&gt;
в последнем случае файл будет искаться в текущем каталоге.&lt;br /&gt;
&lt;br /&gt;
szCommandLine может быть NULL, если не надо передавать командную строку&lt;br /&gt;
запускаемому процессу.&lt;br /&gt;
&lt;br /&gt;
szCurrentDirectory может быть NULL, тогда текущий каталог будет как у&lt;br /&gt;
родительского процесса.&lt;br /&gt;
===Как сменить иконку у диалога или мейнфрейма? (поставить свою иконку из ресурсов)===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	HICON m_hIcon;//&lt;br /&gt;
...&lt;br /&gt;
...&lt;br /&gt;
	HICON m_hIcon = AfxGetApp()-&amp;gt;LoadIcon(IDR_1);&lt;br /&gt;
	SetIcon(m_hIcon, TRUE);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
где&lt;br /&gt;
&lt;br /&gt;
IDR_1 - ИД иконки в ресурсах&lt;br /&gt;
&lt;br /&gt;
m_hIcon - хендл типа HICON (естественно - не временный, а, скажем, член класса)&lt;br /&gt;
&lt;br /&gt;
===Как во время долгих вычислений или в обработчике сообщения НЕМЕДЛЕННО перерисовать окно?===&lt;br /&gt;
скажем , находимся в неком обработчике диалога&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
MyDialog::f()&lt;br /&gt;
{&lt;br /&gt;
	...&lt;br /&gt;
	...&lt;br /&gt;
	//тут потребовалось перерисовать немедленно&lt;br /&gt;
	&lt;br /&gt;
	//помечаем всё окно &amp;quot;инвалидным&amp;quot; (требующим перерисовки)&lt;br /&gt;
	Invalidate(0);&lt;br /&gt;
	//перерисовываем &amp;quot;напрямую&amp;quot; посылая сообщение WM_PAINT в&lt;br /&gt;
	//оконную процедуру, минуя очередь сообщений&lt;br /&gt;
	UpdateWindow();&lt;br /&gt;
	...&lt;br /&gt;
	...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:FAQ]]&lt;/div&gt;</summary>
		<author><name>Mczim</name></author>	</entry>

	<entry>
		<id>https://wiki.shelek.ru/index.php?title=FAQ:WinAPI,_VCPP_Part_4&amp;diff=427</id>
		<title>FAQ:WinAPI, VCPP Part 4</title>
		<link rel="alternate" type="text/html" href="https://wiki.shelek.ru/index.php?title=FAQ:WinAPI,_VCPP_Part_4&amp;diff=427"/>
				<updated>2008-08-14T19:19:58Z</updated>
		
		<summary type="html">&lt;p&gt;Mczim: и  наоборот использовать функции API &amp;gt; и  наоборот, использовать функции API&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Как создавать всплывающие сообщения?===&lt;br /&gt;
Называется ето сообщение Balloon ToolTip. В МСДН-е есть статейка по этому поводу называется &amp;quot;Using ToolTip Controls&amp;quot;&lt;br /&gt;
[[Изображение:context_help.GIF]]&lt;br /&gt;
&lt;br /&gt;
Тематические ссылки:&lt;br /&gt;
http://www.codeproject.com/shell/LiviuBirjegaCode.asp&lt;br /&gt;
http://www.codeproject.com/useritems/wtlntray.asp&lt;br /&gt;
&lt;br /&gt;
Для получения сообщения того, как на картинке установите стиль&lt;br /&gt;
TTS_BALLOON==0x40&lt;br /&gt;
&lt;br /&gt;
и еще:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CToolTipCtrl::SetDelayTime(TTDT_AUTOPOP,10000);//время горения&lt;br /&gt;
CToolTipCtrl::SetDelayTime(TTDT_INITIAL,300);//через какое время появится на экране после наведения курсора&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Не могу понять, что делает функция ScrollWindow()===&lt;br /&gt;
К примеру, у вас есть уже нарисованное изображение на клиентской части окна, и нужно сделать скролинг этой части.&lt;br /&gt;
&lt;br /&gt;
Первый путь: Стереть что уже было нарисовано, и перерисовывать все заново с учетом скролинга.&lt;br /&gt;
&lt;br /&gt;
Второй путь: Передвинуть ту часть, которая останется в зоне видимости, и дорисовать недостаюшую часть. Вот ScrollWindow() и делает передвижение рисунка на заданное количество пикселей. Остаётся потом только дорисовать&lt;br /&gt;
&lt;br /&gt;
===В редакторе ресурсов на диалоге создаю элемент ComboBox. Почему во время работы программы список не выпадает, хотя клавишами &amp;quot;вверх&amp;quot; и &amp;quot;вниз&amp;quot; значения перебираются?===&lt;br /&gt;
Находясь в редакторе форм, щёлкните по стрелке комбобокса - и за нижний маркер растяни вниз - то есть задайте размер выпадающего&lt;br /&gt;
списка.&lt;br /&gt;
&lt;br /&gt;
===Internet Explorer: как поменять настройки программно?===&lt;br /&gt;
путь в реестре:&lt;br /&gt;
 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\AdvancedOptions\ (всякие настройки)&lt;br /&gt;
&lt;br /&gt;
===Как узнать, когда приложение уже готово к работе? (в этот момент мне нужно стартовать вспомогательный диалог для показа определенных значений)===&lt;br /&gt;
Можно попробовать переопределить функцию CWinApp::OnIdle. Эта функция вызывается всякий раз, когда в очереди сообщений&lt;br /&gt;
приложения нет больше сообщений. И при первом вызове OnIdle показывать вспомогательный диалог.&lt;br /&gt;
&lt;br /&gt;
===Как получить короткое и длинное имя файла?===&lt;br /&gt;
Например имеется путь к файлу:&lt;br /&gt;
   D:\program files\Microsoft Office\OFFICE11\winword.exe&lt;br /&gt;
надо привести его к виду:&lt;br /&gt;
   d:\PROGRA~1\MICROS~2\OFFICE11\WINWORD.EXE&lt;br /&gt;
и  наоборот,&lt;br /&gt;
использовать функции API&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
GetShortPathName(&lt;br /&gt;
	LPCSTR lpszLongPath,&lt;br /&gt;
	LPSTR  lpszShortPath,&lt;br /&gt;
	DWORD    cchBuffer);	//получить короткий путь&lt;br /&gt;
и&lt;br /&gt;
GetLongPathName(&lt;br /&gt;
	LPCSTR lpszShortPath,&lt;br /&gt;
	LPSTR  lpszLongPath,&lt;br /&gt;
	DWORD    cchBuffer);	//получить полный путь&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===В чём разница между сообщениями WM_MOVE и WM_MOVING ?===&lt;br /&gt;
VM_MOVING - посылается окну, когда пользователь перемещает окно&lt;br /&gt;
&lt;br /&gt;
VM_MOVE - посылается окну, когда пользователь завершил перемещение&lt;br /&gt;
   окна (отпустил кнопку мыши)&lt;br /&gt;
=== Как из программы определить каталог, в котором находится эта программа?===&lt;br /&gt;
Функция&lt;br /&gt;
 GetModuleFileName&lt;br /&gt;
возвращает абсолютное имя модуля.&lt;br /&gt;
&lt;br /&gt;
В MFC можно использовать переменную-член класса CWinApp, определённую как&lt;br /&gt;
 LPCTSTR m_pszExeName;&lt;br /&gt;
Вызывать так:&lt;br /&gt;
 AfxGetApp()-&amp;gt;m_pszExeName;&lt;br /&gt;
===Как получить полное имя пользователя и организации, то есть то, что на диалоге system properties (горячая кнопка [ Win ] + Break ) на закладке General перечисленно под пунктом Registred To ? ===&lt;br /&gt;
в реестре&lt;br /&gt;
&lt;br /&gt;
тут&lt;br /&gt;
 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion&lt;br /&gt;
&lt;br /&gt;
или тут&lt;br /&gt;
 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion&lt;br /&gt;
&lt;br /&gt;
(зависит от версии Windows)&lt;br /&gt;
===Мне надо в процессе выполнения программы динамичски создавать / удалять элементы (иконки и текстбоксы). Для этого мне надо при создании элемента задавать ID. Как определить первый свободный ИД, который можно использовать ?===&lt;br /&gt;
Можно поступить так: Начать &amp;quot;поиск&amp;quot; ID со значения 1000 и, проверяя функцией GetDlgItem(), увеличивать значение на единицу до тех пор, пока не будет найден свободный ID.&lt;br /&gt;
===Как изменить цвет рамки приложения? Пытаюсь закрашивать в OnPaint(), ничего не получается===&lt;br /&gt;
Это сделать, если перехватывать сообщение, которое идет на прорисовку не клиентской части окна WM_NCPAINT&lt;br /&gt;
===Я запускаю экзешник при помощи ::ShellExecute(). Процедура тут же возвращает управление, а мне нужно дождаться, когда запущенный процесс завершится, а только потом продолжить дальнейшее выполнение программы. Как это сделать?===&lt;br /&gt;
Нужно использовать CreateProcess/WaitForSingeObject.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	STARTUPINFO	StartupInfo;&lt;br /&gt;
	PROCESS_INFORMATION ProcessInfo;&lt;br /&gt;
	DWORD dwRetValue;&lt;br /&gt;
	RtlZeroMemory(&amp;amp;StartupInfo, sizeof(StartupInfo));&lt;br /&gt;
	StartupInfo.cb = sizeof(StartupInfo);&lt;br /&gt;
	if(!CreateProcess(&lt;br /&gt;
		szApplicationName,&lt;br /&gt;
		szCommandLine,&lt;br /&gt;
		NULL, NULL, FALSE,&lt;br /&gt;
		NORMAL_PRIORITY_CLASS,&lt;br /&gt;
		NULL,&lt;br /&gt;
		szCurrentDirectory,&lt;br /&gt;
		&amp;amp;StartupInfo,&lt;br /&gt;
		&amp;amp;ProcessInfo))&lt;br /&gt;
	{&lt;br /&gt;
		//ошибка&lt;br /&gt;
		DWORD dwdErr=GetLastError(); //определяем ошибку&lt;br /&gt;
	}&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
		CloseHandle(ProcessInfo.hThread);&lt;br /&gt;
		WaitForSingleObject(ProcessInfo.hProcess, 30000);&lt;br /&gt;
		GetExitCodeProcess(ProcessInfo.hProcess, &amp;amp;dwRetValue);&lt;br /&gt;
		CloseHandle(ProcessInfo.hProcess);&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
В szApplicationName может быть либо полный путь к файлу, либо только имя файла,&lt;br /&gt;
в последнем случае файл будет искаться в текущем каталоге.&lt;br /&gt;
&lt;br /&gt;
szCommandLine может быть NULL, если не надо передавать командную строку&lt;br /&gt;
запускаемому процессу.&lt;br /&gt;
&lt;br /&gt;
szCurrentDirectory может быть NULL, тогда текущий каталог будет как у&lt;br /&gt;
родительского процесса.&lt;br /&gt;
===Как сменить иконку у диалога или мейнфрейма? (поставить свою иконку из ресурсов)===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	HICON m_hIcon;//&lt;br /&gt;
...&lt;br /&gt;
...&lt;br /&gt;
	HICON m_hIcon = AfxGetApp()-&amp;gt;LoadIcon(IDR_1);&lt;br /&gt;
	SetIcon(m_hIcon, TRUE);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
где&lt;br /&gt;
&lt;br /&gt;
IDR_1 - ИД иконки в ресурсах&lt;br /&gt;
&lt;br /&gt;
m_hIcon - хендл типа HICON (естественно - не временный, а, скажем, член класса)&lt;br /&gt;
&lt;br /&gt;
===Как во время долгих вычислений или в обработчике сообщения НЕМЕДЛЕННО перерисовать окно?===&lt;br /&gt;
скажем , находимся в неком обработчике диалога&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
MyDialog::f()&lt;br /&gt;
{&lt;br /&gt;
	...&lt;br /&gt;
	...&lt;br /&gt;
	//тут потребовалось перерисовать немедленно&lt;br /&gt;
	&lt;br /&gt;
	//помечаем всё окно &amp;quot;инвалидным&amp;quot; (требующим перерисовки)&lt;br /&gt;
	Invalidate(0);&lt;br /&gt;
	//перерисовываем &amp;quot;напрямую&amp;quot; посылая сообщение WM_PAINT в&lt;br /&gt;
	//оконную процедуру, минуя очередь сообщений&lt;br /&gt;
	UpdateWindow();&lt;br /&gt;
	...&lt;br /&gt;
	...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:FAQ]]&lt;/div&gt;</summary>
		<author><name>Mczim</name></author>	</entry>

	<entry>
		<id>https://wiki.shelek.ru/index.php?title=FAQ:WinAPI,_VCPP_Part_4&amp;diff=426</id>
		<title>FAQ:WinAPI, VCPP Part 4</title>
		<link rel="alternate" type="text/html" href="https://wiki.shelek.ru/index.php?title=FAQ:WinAPI,_VCPP_Part_4&amp;diff=426"/>
				<updated>2008-08-14T19:18:47Z</updated>
		
		<summary type="html">&lt;p&gt;Mczim: пробел перед двоеточием&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Как создавать всплывающие сообщения?===&lt;br /&gt;
Называется ето сообщение Balloon ToolTip. В МСДН-е есть статейка по этому поводу называется &amp;quot;Using ToolTip Controls&amp;quot;&lt;br /&gt;
[[Изображение:context_help.GIF]]&lt;br /&gt;
&lt;br /&gt;
Тематические ссылки:&lt;br /&gt;
http://www.codeproject.com/shell/LiviuBirjegaCode.asp&lt;br /&gt;
http://www.codeproject.com/useritems/wtlntray.asp&lt;br /&gt;
&lt;br /&gt;
Для получения сообщения того, как на картинке установите стиль&lt;br /&gt;
TTS_BALLOON==0x40&lt;br /&gt;
&lt;br /&gt;
и еще:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CToolTipCtrl::SetDelayTime(TTDT_AUTOPOP,10000);//время горения&lt;br /&gt;
CToolTipCtrl::SetDelayTime(TTDT_INITIAL,300);//через какое время появится на экране после наведения курсора&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Не могу понять, что делает функция ScrollWindow()===&lt;br /&gt;
К примеру, у вас есть уже нарисованное изображение на клиентской части окна, и нужно сделать скролинг этой части.&lt;br /&gt;
&lt;br /&gt;
Первый путь: Стереть что уже было нарисовано, и перерисовывать все заново с учетом скролинга.&lt;br /&gt;
&lt;br /&gt;
Второй путь: Передвинуть ту часть, которая останется в зоне видимости, и дорисовать недостаюшую часть. Вот ScrollWindow() и делает передвижение рисунка на заданное количество пикселей. Остаётся потом только дорисовать&lt;br /&gt;
&lt;br /&gt;
===В редакторе ресурсов на диалоге создаю элемент ComboBox. Почему во время работы программы список не выпадает, хотя клавишами &amp;quot;вверх&amp;quot; и &amp;quot;вниз&amp;quot; значения перебираются?===&lt;br /&gt;
Находясь в редакторе форм, щёлкните по стрелке комбобокса - и за нижний маркер растяни вниз - то есть задайте размер выпадающего&lt;br /&gt;
списка.&lt;br /&gt;
&lt;br /&gt;
===Internet Explorer: как поменять настройки программно?===&lt;br /&gt;
путь в реестре:&lt;br /&gt;
 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\AdvancedOptions\ (всякие настройки)&lt;br /&gt;
&lt;br /&gt;
===Как узнать, когда приложение уже готово к работе? (в этот момент мне нужно стартовать вспомогательный диалог для показа определенных значений)===&lt;br /&gt;
Можно попробовать переопределить функцию CWinApp::OnIdle. Эта функция вызывается всякий раз, когда в очереди сообщений&lt;br /&gt;
приложения нет больше сообщений. И при первом вызове OnIdle показывать вспомогательный диалог.&lt;br /&gt;
&lt;br /&gt;
===Как получить короткое и длинное имя файла?===&lt;br /&gt;
Например имеется путь к файлу:&lt;br /&gt;
   D:\program files\Microsoft Office\OFFICE11\winword.exe&lt;br /&gt;
надо привести его к виду:&lt;br /&gt;
   d:\PROGRA~1\MICROS~2\OFFICE11\WINWORD.EXE&lt;br /&gt;
и  наоборот&lt;br /&gt;
использовать функции API&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
GetShortPathName(&lt;br /&gt;
	LPCSTR lpszLongPath,&lt;br /&gt;
	LPSTR  lpszShortPath,&lt;br /&gt;
	DWORD    cchBuffer);	//получить короткий путь&lt;br /&gt;
и&lt;br /&gt;
GetLongPathName(&lt;br /&gt;
	LPCSTR lpszShortPath,&lt;br /&gt;
	LPSTR  lpszLongPath,&lt;br /&gt;
	DWORD    cchBuffer);	//получить полный путь&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===В чём разница между сообщениями WM_MOVE и WM_MOVING ?===&lt;br /&gt;
VM_MOVING - посылается окну, когда пользователь перемещает окно&lt;br /&gt;
&lt;br /&gt;
VM_MOVE - посылается окну, когда пользователь завершил перемещение&lt;br /&gt;
   окна (отпустил кнопку мыши)&lt;br /&gt;
=== Как из программы определить каталог, в котором находится эта программа?===&lt;br /&gt;
Функция&lt;br /&gt;
 GetModuleFileName&lt;br /&gt;
возвращает абсолютное имя модуля.&lt;br /&gt;
&lt;br /&gt;
В MFC можно использовать переменную-член класса CWinApp, определённую как&lt;br /&gt;
 LPCTSTR m_pszExeName;&lt;br /&gt;
Вызывать так:&lt;br /&gt;
 AfxGetApp()-&amp;gt;m_pszExeName;&lt;br /&gt;
===Как получить полное имя пользователя и организации, то есть то, что на диалоге system properties (горячая кнопка [ Win ] + Break ) на закладке General перечисленно под пунктом Registred To ? ===&lt;br /&gt;
в реестре&lt;br /&gt;
&lt;br /&gt;
тут&lt;br /&gt;
 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion&lt;br /&gt;
&lt;br /&gt;
или тут&lt;br /&gt;
 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion&lt;br /&gt;
&lt;br /&gt;
(зависит от версии Windows)&lt;br /&gt;
===Мне надо в процессе выполнения программы динамичски создавать / удалять элементы (иконки и текстбоксы). Для этого мне надо при создании элемента задавать ID. Как определить первый свободный ИД, который можно использовать ?===&lt;br /&gt;
Можно поступить так: Начать &amp;quot;поиск&amp;quot; ID со значения 1000 и, проверяя функцией GetDlgItem(), увеличивать значение на единицу до тех пор, пока не будет найден свободный ID.&lt;br /&gt;
===Как изменить цвет рамки приложения? Пытаюсь закрашивать в OnPaint(), ничего не получается===&lt;br /&gt;
Это сделать, если перехватывать сообщение, которое идет на прорисовку не клиентской части окна WM_NCPAINT&lt;br /&gt;
===Я запускаю экзешник при помощи ::ShellExecute(). Процедура тут же возвращает управление, а мне нужно дождаться, когда запущенный процесс завершится, а только потом продолжить дальнейшее выполнение программы. Как это сделать?===&lt;br /&gt;
Нужно использовать CreateProcess/WaitForSingeObject.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	STARTUPINFO	StartupInfo;&lt;br /&gt;
	PROCESS_INFORMATION ProcessInfo;&lt;br /&gt;
	DWORD dwRetValue;&lt;br /&gt;
	RtlZeroMemory(&amp;amp;StartupInfo, sizeof(StartupInfo));&lt;br /&gt;
	StartupInfo.cb = sizeof(StartupInfo);&lt;br /&gt;
	if(!CreateProcess(&lt;br /&gt;
		szApplicationName,&lt;br /&gt;
		szCommandLine,&lt;br /&gt;
		NULL, NULL, FALSE,&lt;br /&gt;
		NORMAL_PRIORITY_CLASS,&lt;br /&gt;
		NULL,&lt;br /&gt;
		szCurrentDirectory,&lt;br /&gt;
		&amp;amp;StartupInfo,&lt;br /&gt;
		&amp;amp;ProcessInfo))&lt;br /&gt;
	{&lt;br /&gt;
		//ошибка&lt;br /&gt;
		DWORD dwdErr=GetLastError(); //определяем ошибку&lt;br /&gt;
	}&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
		CloseHandle(ProcessInfo.hThread);&lt;br /&gt;
		WaitForSingleObject(ProcessInfo.hProcess, 30000);&lt;br /&gt;
		GetExitCodeProcess(ProcessInfo.hProcess, &amp;amp;dwRetValue);&lt;br /&gt;
		CloseHandle(ProcessInfo.hProcess);&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
В szApplicationName может быть либо полный путь к файлу, либо только имя файла,&lt;br /&gt;
в последнем случае файл будет искаться в текущем каталоге.&lt;br /&gt;
&lt;br /&gt;
szCommandLine может быть NULL, если не надо передавать командную строку&lt;br /&gt;
запускаемому процессу.&lt;br /&gt;
&lt;br /&gt;
szCurrentDirectory может быть NULL, тогда текущий каталог будет как у&lt;br /&gt;
родительского процесса.&lt;br /&gt;
===Как сменить иконку у диалога или мейнфрейма? (поставить свою иконку из ресурсов)===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	HICON m_hIcon;//&lt;br /&gt;
...&lt;br /&gt;
...&lt;br /&gt;
	HICON m_hIcon = AfxGetApp()-&amp;gt;LoadIcon(IDR_1);&lt;br /&gt;
	SetIcon(m_hIcon, TRUE);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
где&lt;br /&gt;
&lt;br /&gt;
IDR_1 - ИД иконки в ресурсах&lt;br /&gt;
&lt;br /&gt;
m_hIcon - хендл типа HICON (естественно - не временный, а, скажем, член класса)&lt;br /&gt;
&lt;br /&gt;
===Как во время долгих вычислений или в обработчике сообщения НЕМЕДЛЕННО перерисовать окно?===&lt;br /&gt;
скажем , находимся в неком обработчике диалога&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
MyDialog::f()&lt;br /&gt;
{&lt;br /&gt;
	...&lt;br /&gt;
	...&lt;br /&gt;
	//тут потребовалось перерисовать немедленно&lt;br /&gt;
	&lt;br /&gt;
	//помечаем всё окно &amp;quot;инвалидным&amp;quot; (требующим перерисовки)&lt;br /&gt;
	Invalidate(0);&lt;br /&gt;
	//перерисовываем &amp;quot;напрямую&amp;quot; посылая сообщение WM_PAINT в&lt;br /&gt;
	//оконную процедуру, минуя очередь сообщений&lt;br /&gt;
	UpdateWindow();&lt;br /&gt;
	...&lt;br /&gt;
	...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:FAQ]]&lt;/div&gt;</summary>
		<author><name>Mczim</name></author>	</entry>

	<entry>
		<id>https://wiki.shelek.ru/index.php?title=FAQ:WinAPI,_VCPP_Part_4&amp;diff=425</id>
		<title>FAQ:WinAPI, VCPP Part 4</title>
		<link rel="alternate" type="text/html" href="https://wiki.shelek.ru/index.php?title=FAQ:WinAPI,_VCPP_Part_4&amp;diff=425"/>
				<updated>2008-08-14T19:17:05Z</updated>
		
		<summary type="html">&lt;p&gt;Mczim: етому &amp;gt; этому&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Как создавать всплывающие сообщения?===&lt;br /&gt;
Называется ето сообщение Balloon ToolTip. В МСДН-е есть статейка по этому поводу называется &amp;quot;Using ToolTip Controls&amp;quot;&lt;br /&gt;
[[Изображение:context_help.GIF]]&lt;br /&gt;
&lt;br /&gt;
Тематические ссылки:&lt;br /&gt;
http://www.codeproject.com/shell/LiviuBirjegaCode.asp&lt;br /&gt;
http://www.codeproject.com/useritems/wtlntray.asp&lt;br /&gt;
&lt;br /&gt;
Для получения сообщения того, как на картинке установите стиль&lt;br /&gt;
TTS_BALLOON==0x40&lt;br /&gt;
&lt;br /&gt;
и еще:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CToolTipCtrl::SetDelayTime(TTDT_AUTOPOP,10000);//время горения&lt;br /&gt;
CToolTipCtrl::SetDelayTime(TTDT_INITIAL,300);//через какое время появится на экране после наведения курсора&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Не могу понять, что делает функция ScrollWindow()===&lt;br /&gt;
К примеру, у вас есть уже нарисованное изображение на клиентской части окна, и нужно сделать скролинг этой части.&lt;br /&gt;
&lt;br /&gt;
Первый путь: Стереть что уже было нарисовано, и перерисовывать все заново с учетом скролинга.&lt;br /&gt;
&lt;br /&gt;
Второй путь: Передвинуть ту часть, которая останется в зоне видимости, и дорисовать недостаюшую часть. Вот ScrollWindow() и делает передвижение рисунка на заданное количество пикселей. Остаётся потом только дорисовать&lt;br /&gt;
&lt;br /&gt;
===В редакторе ресурсов на диалоге создаю элемент ComboBox. Почему во время работы программы список не выпадает, хотя клавишами &amp;quot;вверх&amp;quot; и &amp;quot;вниз&amp;quot; значения перебираются?===&lt;br /&gt;
Находясь в редакторе форм, щёлкните по стрелке комбобокса - и за нижний маркер растяни вниз - то есть задайте размер выпадающего&lt;br /&gt;
списка.&lt;br /&gt;
&lt;br /&gt;
===Internet Explorer : как поменять настройки программно?===&lt;br /&gt;
путь в реестре:&lt;br /&gt;
 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\AdvancedOptions\ (всякие настройки)&lt;br /&gt;
&lt;br /&gt;
===Как узнать, когда приложение уже готово к работе? (в этот момент мне нужно стартовать вспомогательный диалог для показа определенных значений)===&lt;br /&gt;
Можно попробовать переопределить функцию CWinApp::OnIdle. Эта функция вызывается всякий раз, когда в очереди сообщений&lt;br /&gt;
приложения нет больше сообщений. И при первом вызове OnIdle показывать вспомогательный диалог.&lt;br /&gt;
&lt;br /&gt;
===Как получить короткое и длинное имя файла?===&lt;br /&gt;
Например имеется путь к файлу:&lt;br /&gt;
   D:\program files\Microsoft Office\OFFICE11\winword.exe&lt;br /&gt;
надо привести его к виду:&lt;br /&gt;
   d:\PROGRA~1\MICROS~2\OFFICE11\WINWORD.EXE&lt;br /&gt;
и  наоборот&lt;br /&gt;
использовать функции API&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
GetShortPathName(&lt;br /&gt;
	LPCSTR lpszLongPath,&lt;br /&gt;
	LPSTR  lpszShortPath,&lt;br /&gt;
	DWORD    cchBuffer);	//получить короткий путь&lt;br /&gt;
и&lt;br /&gt;
GetLongPathName(&lt;br /&gt;
	LPCSTR lpszShortPath,&lt;br /&gt;
	LPSTR  lpszLongPath,&lt;br /&gt;
	DWORD    cchBuffer);	//получить полный путь&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===В чём разница между сообщениями WM_MOVE и WM_MOVING ?===&lt;br /&gt;
VM_MOVING - посылается окну, когда пользователь перемещает окно&lt;br /&gt;
&lt;br /&gt;
VM_MOVE - посылается окну, когда пользователь завершил перемещение&lt;br /&gt;
   окна (отпустил кнопку мыши)&lt;br /&gt;
=== Как из программы определить каталог, в котором находится эта программа?===&lt;br /&gt;
Функция&lt;br /&gt;
 GetModuleFileName&lt;br /&gt;
возвращает абсолютное имя модуля.&lt;br /&gt;
&lt;br /&gt;
В MFC можно использовать переменную-член класса CWinApp, определённую как&lt;br /&gt;
 LPCTSTR m_pszExeName;&lt;br /&gt;
Вызывать так:&lt;br /&gt;
 AfxGetApp()-&amp;gt;m_pszExeName;&lt;br /&gt;
===Как получить полное имя пользователя и организации, то есть то, что на диалоге system properties (горячая кнопка [ Win ] + Break ) на закладке General перечисленно под пунктом Registred To ? ===&lt;br /&gt;
в реестре&lt;br /&gt;
&lt;br /&gt;
тут&lt;br /&gt;
 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion&lt;br /&gt;
&lt;br /&gt;
или тут&lt;br /&gt;
 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion&lt;br /&gt;
&lt;br /&gt;
(зависит от версии Windows)&lt;br /&gt;
===Мне надо в процессе выполнения программы динамичски создавать / удалять элементы (иконки и текстбоксы). Для этого мне надо при создании элемента задавать ID. Как определить первый свободный ИД, который можно использовать ?===&lt;br /&gt;
Можно поступить так: Начать &amp;quot;поиск&amp;quot; ID со значения 1000 и, проверяя функцией GetDlgItem(), увеличивать значение на единицу до тех пор, пока не будет найден свободный ID.&lt;br /&gt;
===Как изменить цвет рамки приложения? Пытаюсь закрашивать в OnPaint(), ничего не получается===&lt;br /&gt;
Это сделать, если перехватывать сообщение, которое идет на прорисовку не клиентской части окна WM_NCPAINT&lt;br /&gt;
===Я запускаю экзешник при помощи ::ShellExecute(). Процедура тут же возвращает управление, а мне нужно дождаться, когда запущенный процесс завершится, а только потом продолжить дальнейшее выполнение программы. Как это сделать?===&lt;br /&gt;
Нужно использовать CreateProcess/WaitForSingeObject.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	STARTUPINFO	StartupInfo;&lt;br /&gt;
	PROCESS_INFORMATION ProcessInfo;&lt;br /&gt;
	DWORD dwRetValue;&lt;br /&gt;
	RtlZeroMemory(&amp;amp;StartupInfo, sizeof(StartupInfo));&lt;br /&gt;
	StartupInfo.cb = sizeof(StartupInfo);&lt;br /&gt;
	if(!CreateProcess(&lt;br /&gt;
		szApplicationName,&lt;br /&gt;
		szCommandLine,&lt;br /&gt;
		NULL, NULL, FALSE,&lt;br /&gt;
		NORMAL_PRIORITY_CLASS,&lt;br /&gt;
		NULL,&lt;br /&gt;
		szCurrentDirectory,&lt;br /&gt;
		&amp;amp;StartupInfo,&lt;br /&gt;
		&amp;amp;ProcessInfo))&lt;br /&gt;
	{&lt;br /&gt;
		//ошибка&lt;br /&gt;
		DWORD dwdErr=GetLastError(); //определяем ошибку&lt;br /&gt;
	}&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
		CloseHandle(ProcessInfo.hThread);&lt;br /&gt;
		WaitForSingleObject(ProcessInfo.hProcess, 30000);&lt;br /&gt;
		GetExitCodeProcess(ProcessInfo.hProcess, &amp;amp;dwRetValue);&lt;br /&gt;
		CloseHandle(ProcessInfo.hProcess);&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
В szApplicationName может быть либо полный путь к файлу, либо только имя файла,&lt;br /&gt;
в последнем случае файл будет искаться в текущем каталоге.&lt;br /&gt;
&lt;br /&gt;
szCommandLine может быть NULL, если не надо передавать командную строку&lt;br /&gt;
запускаемому процессу.&lt;br /&gt;
&lt;br /&gt;
szCurrentDirectory может быть NULL, тогда текущий каталог будет как у&lt;br /&gt;
родительского процесса.&lt;br /&gt;
===Как сменить иконку у диалога или мейнфрейма? (поставить свою иконку из ресурсов)===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	HICON m_hIcon;//&lt;br /&gt;
...&lt;br /&gt;
...&lt;br /&gt;
	HICON m_hIcon = AfxGetApp()-&amp;gt;LoadIcon(IDR_1);&lt;br /&gt;
	SetIcon(m_hIcon, TRUE);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
где&lt;br /&gt;
&lt;br /&gt;
IDR_1 - ИД иконки в ресурсах&lt;br /&gt;
&lt;br /&gt;
m_hIcon - хендл типа HICON (естественно - не временный, а, скажем, член класса)&lt;br /&gt;
&lt;br /&gt;
===Как во время долгих вычислений или в обработчике сообщения НЕМЕДЛЕННО перерисовать окно?===&lt;br /&gt;
скажем , находимся в неком обработчике диалога&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
MyDialog::f()&lt;br /&gt;
{&lt;br /&gt;
	...&lt;br /&gt;
	...&lt;br /&gt;
	//тут потребовалось перерисовать немедленно&lt;br /&gt;
	&lt;br /&gt;
	//помечаем всё окно &amp;quot;инвалидным&amp;quot; (требующим перерисовки)&lt;br /&gt;
	Invalidate(0);&lt;br /&gt;
	//перерисовываем &amp;quot;напрямую&amp;quot; посылая сообщение WM_PAINT в&lt;br /&gt;
	//оконную процедуру, минуя очередь сообщений&lt;br /&gt;
	UpdateWindow();&lt;br /&gt;
	...&lt;br /&gt;
	...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:FAQ]]&lt;/div&gt;</summary>
		<author><name>Mczim</name></author>	</entry>

	<entry>
		<id>https://wiki.shelek.ru/index.php?title=FAQ:WinAPI,_VCPP_Part_3&amp;diff=424</id>
		<title>FAQ:WinAPI, VCPP Part 3</title>
		<link rel="alternate" type="text/html" href="https://wiki.shelek.ru/index.php?title=FAQ:WinAPI,_VCPP_Part_3&amp;diff=424"/>
				<updated>2008-08-14T19:07:36Z</updated>
		
		<summary type="html">&lt;p&gt;Mczim: Каким способом можно exe файл может заменить самого себя? &amp;gt; Каким способом exe файл может заменить самого себя?&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Имеется приложение на основе CRichEditView. Как узнать, что пользователь меняет текст?===&lt;br /&gt;
Добавить обработчик сообщения EN_CHANGE. Сообщение генерируется CRichEditView каждый раз, когда пользователь изменяет текст в окне CRichEditView&lt;br /&gt;
===Чем метод CArray::GetSize отличается от метода CArray::GetCount?===&lt;br /&gt;
Абсолютно ничем. (Скорее всего, были предыдущие библиотеки, в которых функции, одинаковые по смыслу, имели разные имена. Поэтому в целях совместимости оставили оба)&lt;br /&gt;
===Как загрузить строку из ресурса?===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CString m_Temp;&lt;br /&gt;
m_Temp.LoadString(ID_MYSTRING);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как поменять иконку у элемента (item) в CListCtrl?===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//заполняем структуру LVITEM&lt;br /&gt;
LVITEM lvItem;&lt;br /&gt;
memset(&amp;amp;lvItem,0,sizeof(lvItem));&lt;br /&gt;
	&lt;br /&gt;
lvItem.mask = LVIF_IMAGE;//меняться будет картинка&lt;br /&gt;
lvItem.iItem = ...;// индекс элемента списка (Zero-based)&lt;br /&gt;
lvItem.iSubItem = 0;&lt;br /&gt;
lvItem.iImage = ...; //индекс иконки (из списка контрола)&lt;br /&gt;
	&lt;br /&gt;
pList-&amp;gt;SetItem(&amp;amp; lvItem);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Имеется класс Class1, содержащий мембер типа указатель на Class2. В Class2 также имеется указатель на Class1. Компилятор выдаёт ошибку. Что надо делать?===&lt;br /&gt;
Предварительно объявляем класс Class2. Тогда компилятору будет известно, что описание класса Class2 будет встречено дальше, и станет возможным объявление указателей на класс до описания самого класса.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Class2;//предопределение&lt;br /&gt;
	&lt;br /&gt;
Class1&lt;br /&gt;
{&lt;br /&gt;
	Class2* p;&lt;br /&gt;
};&lt;br /&gt;
	&lt;br /&gt;
Class2&lt;br /&gt;
{&lt;br /&gt;
	Class1* p;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как переключить раскладку в другом (то есть в активном) процессе?===&lt;br /&gt;
Использовать функции:&lt;br /&gt;
   GetKeyboardLayout - определить текущую раскладку&lt;br /&gt;
   LoadKeyboardLayout - загрузить новую раскладку&lt;br /&gt;
&lt;br /&gt;
см.также&lt;br /&gt;
   VerLanguageName - получить строку с описанием языка&lt;br /&gt;
&lt;br /&gt;
(подробности - в MSDN)&lt;br /&gt;
===Как получить хендл контрола Edit зная его ID?===&lt;br /&gt;
Пусть контрол лежит на окне CMyWnd&lt;br /&gt;
Тогда:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void CMyWnd::некая_процедура()&lt;br /&gt;
{&lt;br /&gt;
	//для MFC&lt;br /&gt;
	CEdit* ed=(CEdit* ) GetDlgItem(ID_EDIT1);&lt;br /&gt;
	HWND hwnd=ed-&amp;gt;GetSafeHwnd();&lt;br /&gt;
	...&lt;br /&gt;
	&lt;br /&gt;
	//для Win32 API&lt;br /&gt;
	HWND hwnd=GetDlgItem(m_hWnd,ID_EDIT1);&lt;br /&gt;
	...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Как из дочернего окна закрыть приложение?===&lt;br /&gt;
Нужно послать родительскому окну (*pParent) сообщение WM_CLOSE:&lt;br /&gt;
 pParent-&amp;gt;PostMessage(WM_CLOSE);//MFC&lt;br /&gt;
или&lt;br /&gt;
 ::PostMessage(pParent-&amp;gt;m_hWnd,WM_CLOSE,(WPARAM)0,(LPARAM)0);//API&lt;br /&gt;
===Как корректно перевести BSTR в CString и наоборот?===&lt;br /&gt;
Нужно просто присвоить переменной типа CString переменную типа BSTR.&lt;br /&gt;
Оператор = класса CString сам всё переведёт.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//указатель на будущий буфер с BSTR.&lt;br /&gt;
//	(По сути, BSTR определён как &lt;br /&gt;
//	typedef WCHAR* BSTR;&lt;br /&gt;
//	то есть указатель на 16-битный символ юникод)&lt;br /&gt;
	&lt;br /&gt;
BSTR bstrHE=0;&lt;br /&gt;
	&lt;br /&gt;
CString Str=&amp;quot;мой текст&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
//Выделить память и загрузить адрес блока в bstrHE&lt;br /&gt;
bstrHE=Str.AllocSysString();&lt;br /&gt;
	&lt;br /&gt;
//...	&lt;br /&gt;
//тут работаем с bstrHE[]&lt;br /&gt;
//...&lt;br /&gt;
	&lt;br /&gt;
//освобождаем память&lt;br /&gt;
SysFreeString(bstrHE);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Как получить доступ к графическим ресурсам элементов текущей темы оформления Windows?===&lt;br /&gt;
Использовать функции&lt;br /&gt;
&lt;br /&gt;
OpenThemeData()&lt;br /&gt;
DrawThemeBackground()&lt;br /&gt;
DrawFrameControl()&lt;br /&gt;
CloseThemeData().&lt;br /&gt;
&lt;br /&gt;
(подробности - в MSDN)&lt;br /&gt;
===Имеется класс , производный от CDialog. Когда диалог в фокусе, нажатие на Enter или Esc приводит к закрытию диалога. Как это запретить?===&lt;br /&gt;
При нажатии Enter происходит выполнение команды IDOK,&lt;br /&gt;
при нажатии Esc - IDCANCEL.&lt;br /&gt;
Нужно переопределить в классе виртуальные функции OnOk() и OnCancel(),&lt;br /&gt;
которые соответственно вызываются для этих команд. При помощи&lt;br /&gt;
визарда эти функции добавить можно так: Положить на диалог две кнопки&lt;br /&gt;
с идентификаторами IDOK и IDCANCEL (при создании нового диалога они там&lt;br /&gt;
есть сразу), затем двойной клик по кнопке добавляет соответствующий&lt;br /&gt;
обработчик. В обработчиках надо удалить вызовы СDialog::OnOK() и&lt;br /&gt;
CDialog::OnCancel(), тогда диалог закрываться не будет.&lt;br /&gt;
Однако тогда диалог станет невозможно закрыть кнопкой с крестиком  :)&lt;br /&gt;
&lt;br /&gt;
Лечить так: добавить обработчик сообщения WM_CLOSE - OnClose(), и в нём&lt;br /&gt;
сделать вызов OnOk() или OnCancel() :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void CPlayersPropsDialog::OnClose() &lt;br /&gt;
{&lt;br /&gt;
	CDialog::OnClose();&lt;br /&gt;
	CDialog::OnCancel();//добавлено&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===VC++6. Я написал простейший макрос, а компилятор на него ругается. Ума не приложу, что за глюк?===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	#define my_macr(x,y,z) \&lt;br /&gt;
		z=\&lt;br /&gt;
		(x+y)*\&lt;br /&gt;
		(x-y)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Скорее всего после одного из символов соединения строк &amp;quot;\&amp;quot; имеется&lt;br /&gt;
пробел или табуляция. Их надо удалить. Можно найти их &amp;quot;наощупь&amp;quot;, а&lt;br /&gt;
можно включить показ непечатных символов в студии. Найти эту команду&lt;br /&gt;
можно так:&lt;br /&gt;
Tools-&amp;gt;Customize...-&amp;gt;вкладка Commands. В окошке Category выбрать&lt;br /&gt;
&amp;quot;Edit&amp;quot;, и среди кнопок справа найти кнопку, на которой написано &amp;quot;a.b&amp;quot;&lt;br /&gt;
Эту кнопку надо перетащить на одну из панелей инструментов студии.&lt;br /&gt;
&lt;br /&gt;
===Как получить список всех процесов, включая idle?===&lt;br /&gt;
Использовать функции&lt;br /&gt;
Process32First()&lt;br /&gt;
Precess32Next()&lt;br /&gt;
&lt;br /&gt;
===Как программно установить переменные окружения?===&lt;br /&gt;
Чтобы добавить или изменить их программно, необходимо воспользоваться&lt;br /&gt;
ключом реестра HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\&lt;br /&gt;
Session Manager\Environment, а затем отправить широковещательное&lt;br /&gt;
сообщение WM_SETTINGCHANGE. Это позволит приложениям узнать об&lt;br /&gt;
изменениях:&lt;br /&gt;
&lt;br /&gt;
::SendMessage(HWND_BROADCAST,WM_SETTINGCHANGE,0,0);&lt;br /&gt;
===Как сделать, чтобы у окна был черный фон?===&lt;br /&gt;
переопределить обработчик сообщения WM_CTLCOLOR - OnCtlColor() :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CBrush br(RGB(0,0,0));&lt;br /&gt;
	&lt;br /&gt;
HBRUSH CMyDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) &lt;br /&gt;
{&lt;br /&gt;
	HBRUSH hbr = CMyDlg::OnCtlColor(pDC, pWnd, nCtlColor);&lt;br /&gt;
	&lt;br /&gt;
	//фон диалога (или вьюшки)&lt;br /&gt;
	if(nCtlColor==CTLCOLOR_DLG)&lt;br /&gt;
	{&lt;br /&gt;
		return (HBRUSH)br;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	//фон статиков (если нужно)&lt;br /&gt;
	if(nCtlColor==CTLCOLOR_STATIC)&lt;br /&gt;
	{&lt;br /&gt;
		//делаем фон текста статика прозрачным&lt;br /&gt;
		pDC-&amp;gt;SetBkMode(TRANSPARENT);&lt;br /&gt;
		return (HBRUSH)br;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	return hbr;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Почему на моем компьютере экзешник, созданный в MFC запускается, а на других компьютерах - нет? Требует какую-то  dll-ку.===&lt;br /&gt;
Нужно выбирать режим Release :&lt;br /&gt;
&lt;br /&gt;
Menu-&amp;gt;Build-&amp;gt;Configurations...-&amp;gt;Release,&lt;br /&gt;
&lt;br /&gt;
и экзешник, соответственно, брать из папки Release проекта&lt;br /&gt;
===Как в диалог добавить меню?===&lt;br /&gt;
Надо сделать в ресурсах меню, затем вставить в диалог:&lt;br /&gt;
&lt;br /&gt;
открыть в редакторе диалог, в свойствах (во вкладке General, окошко Menu) указать идентивикатор ресурса меню.&lt;br /&gt;
При помощи визарда добавить для меню обработчики OnCommand() и OnUpdateСommand().&lt;br /&gt;
===Я добавил визардом меню в диалог. Добавил обработчики для пунктов меню. Пункты работают, но OnUpdate для пунктов не вызывается - то есть не получается ни затенить, ни чек поставить. Что делать?===&lt;br /&gt;
В диалоге у меню апдейта не происходит сам, в отличие от мейнфрейма.&lt;br /&gt;
Для этого нужно сделать самим апдейт в обработчике сообщения WM_KICKIDLE.&lt;br /&gt;
Визардом обработчик не добавляется, поэтому можно переопределить виртуальную DefWindowProc() и там обработать:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;afxpriv.h&amp;gt;	//этот файл надо включить, там определёна WM_KICKIDLE&lt;br /&gt;
&lt;br /&gt;
LRESULT CMyDialog::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam) &lt;br /&gt;
{&lt;br /&gt;
	if(message==WM_KICKIDLE)&lt;br /&gt;
	{&lt;br /&gt;
		//делаем апдейт для всех пунктов меню&lt;br /&gt;
		CMenu* pMainMenu=GetMenu();&lt;br /&gt;
		if(pMainMenu)&lt;br /&gt;
		{&lt;br /&gt;
			CCmdUI cmdUI;&lt;br /&gt;
			for (UINT n=0; n &amp;lt; pMainMenu-&amp;gt;GetMenuItemCount(); ++n)&lt;br /&gt;
			{&lt;br /&gt;
				CMenu* pSubMenu = pMainMenu-&amp;gt;GetSubMenu(n);&lt;br /&gt;
				if(!pSubMenu)continue;&lt;br /&gt;
	&lt;br /&gt;
				cmdUI.m_nIndexMax = pSubMenu-&amp;gt;GetMenuItemCount();&lt;br /&gt;
				for (UINT i = 0; i &amp;lt; cmdUI.m_nIndexMax;++i)&lt;br /&gt;
				{&lt;br /&gt;
					cmdUI.m_nIndex = i;&lt;br /&gt;
					cmdUI.m_nID = pSubMenu-&amp;gt;GetMenuItemID(i);&lt;br /&gt;
					cmdUI.m_pMenu = pSubMenu;&lt;br /&gt;
					cmdUI.DoUpdate(this, FALSE);&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	return CDialog::DefWindowProc(message, wParam, lParam);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Как на Visual C++ 6.0 в Главном окне отключить системное меню (в левом верхнем углу) и кнопки(в правом верхнем углу)?===&lt;br /&gt;
При создании окна нужно убрать стиль WS_SYSMENU&lt;br /&gt;
(теперь пользователь корректно может закрыть окно только Alt+F4,&lt;br /&gt;
ну или если вы предоставите ему дополнительную возможность сделать это)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пример 1. (для SDI, MDI)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//этот обработчик уже добавлен визардом&lt;br /&gt;
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT&amp;amp; cs)&lt;br /&gt;
{&lt;br /&gt;
	if( !CFrameWnd::PreCreateWindow(cs) )&lt;br /&gt;
		return FALSE;&lt;br /&gt;
	// TODO: Modify the Window class or styles here by modifying&lt;br /&gt;
	//  the CREATESTRUCT cs&lt;br /&gt;
&lt;br /&gt;
	///////////////////////////////&lt;br /&gt;
	//добавленная часть&lt;br /&gt;
	{&lt;br /&gt;
		//убираем стиль&lt;br /&gt;
		cs.style&amp;amp;=~WS_SYSMENU;&lt;br /&gt;
	}&lt;br /&gt;
	///////////////////////////////&lt;br /&gt;
&lt;br /&gt;
	return TRUE;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Пример 2. (для диалога)&lt;br /&gt;
Если диалог описан в ресурсах, то в свойствах диалога убрать галочки&lt;br /&gt;
  &amp;quot;System menu&amp;quot;&lt;br /&gt;
  &amp;quot;Minimize box&amp;quot;&lt;br /&gt;
  &amp;quot;Maximize box&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===Хочу сделать так, чтобы пользователь не мог нажать на кнопку, пока программа не разрешит.===&lt;br /&gt;
Нужно применить метод класса CWnd::EnableWindow(...) для кнопки.&lt;br /&gt;
Значение параметра 0 делает кнопку неактивной, 1 - делает активной.&lt;br /&gt;
(кстате, не только для кнопки можно, а для любого класса, производного&lt;br /&gt;
от класса CWnd)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пусть имеется некий диалог, на нём лежит кнопка c ID == IDC_1.&lt;br /&gt;
в любом месте кода диалога (кроме конструктора и деструктора , хотя, если&lt;br /&gt;
проверить наличие валидного хендла диалога, как в примере, то ничего&lt;br /&gt;
страшного не будет и там)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//делаем кнопку неактивной&lt;br /&gt;
if(m_hWnd)&lt;br /&gt;
{&lt;br /&gt;
	CWnd* pw=0;&lt;br /&gt;
	pw=GetDlgItem(IDC_1);&lt;br /&gt;
	if(pw)pw-&amp;gt;EnableWindow(0);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Что означают сообщения, которые студия выводит при компиляции, вроде таких : Loaded 'C:\WINDOWS\SYSTEM\WSOCK32.DLL', no matching symbolic information found. ===&lt;br /&gt;
Это строка говорит о том, что студия не смогла найти отладочные&lt;br /&gt;
символы для WSOCK32.DLL. В этом нет ничего страшного, просто при наличии&lt;br /&gt;
отладочных символов в процессе отладки можно получить доступ к именам&lt;br /&gt;
функции из системных DLL. Например, вместо&lt;br /&gt;
 KERNEL32! 0x77E8B184() -&lt;br /&gt;
 увидим&lt;br /&gt;
 KERNEL32!CreateThread.&lt;br /&gt;
===Как обработать сообщения, которое приходит к некому контролу (скажем CEdit)?===&lt;br /&gt;
Нужно произвести от CEdit свой класс, и в виртуальной процедуре класса WindowProc перехватить нужные сообщения.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
virtual LRESULT WindowProc(&lt;br /&gt;
   UINT message,&lt;br /&gt;
   WPARAM wParam,&lt;br /&gt;
   LPARAM lParam &lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Пример. Полностью выключаем, скажем, обработку сообщения WM_CHAR&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	LRESULT CMyEdit::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) &lt;br /&gt;
	{&lt;br /&gt;
		switch(message)&lt;br /&gt;
		{&lt;br /&gt;
			case WM_CHAR:&lt;br /&gt;
			{&lt;br /&gt;
				return 0;&lt;br /&gt;
			}&lt;br /&gt;
			break;&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		return CEdit::WindowProc(message, wParam, lParam);&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Чтобы связать экземпляр класса с контролом на форме, добавьте визардом для&lt;br /&gt;
контрола переменную класса (выбрав не Value а Control).&lt;br /&gt;
&lt;br /&gt;
===Как настроить количество пробелов в табуляции?===&lt;br /&gt;
Tools-&amp;gt;Options-&amp;gt;Tabs-&amp;gt;Insert Spaces&lt;br /&gt;
(или  правой кнопкой мыши по тексту-&amp;gt; properties)&lt;br /&gt;
===Как автоматически расставить отступы?===&lt;br /&gt;
Выделить текст для форматирования, нажать Alt+F8&lt;br /&gt;
&lt;br /&gt;
Есть ещё программа Artistic Style, которая занимается&lt;br /&gt;
переформатированием кода&lt;br /&gt;
http://sourceforge.net/projects/astyle/&lt;br /&gt;
===Поиск границ блока===&lt;br /&gt;
&amp;quot;CTRL+ }&amp;quot; ищет парную фигурную скобку в тексте и переходит на неё&lt;br /&gt;
===Вертикальное выделение текста===&lt;br /&gt;
&amp;quot;Alt + выделение мышкой&amp;quot; - позволяет выделять вертикальные фрагменты текста&lt;br /&gt;
===Как узнать количество установленных в CListCtrl столбцов?===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CListCtrl* pL=...; //указатель на переменную-контрол&lt;br /&gt;
&lt;br /&gt;
int count=pL-&amp;gt;GetHeaderCtrl()-&amp;gt;GetItemCount();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Как получить иконку приложения?===&lt;br /&gt;
Если приложение запущено, то нужно найти его главное окно и&lt;br /&gt;
послать ему сообщение WM_GETICON.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//функция возвращант хендл иконки &lt;br /&gt;
LRESULT SendMessage(hWnd, WM_GETICON, wParam, 0);&lt;br /&gt;
&lt;br /&gt;
//hWnd == хендл окна приложения&lt;br /&gt;
//wParam == &lt;br /&gt;
//	1)==ICON_BIG - получить большую иконку&lt;br /&gt;
//	2)==ICON_SMALL - получить маленькую иконку&lt;br /&gt;
//	3)==ICON_SMALL2 - получить маленькую иконку, если она определена&lt;br /&gt;
//				в приложении. Если её нет, то маленькую иконку, &lt;br /&gt;
//				сгенерированную системой из большой иконки&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как в CString можно найти или вырезать часть строки?===&lt;br /&gt;
есть такие методы в CString:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//вырезает кусок строки&lt;br /&gt;
CString Mid(int nFirst) const;&lt;br /&gt;
CString Mid(int nFirst,  int nCount) const;&lt;br /&gt;
&lt;br /&gt;
//возвращает кусок строки (сначала или с конца)&lt;br /&gt;
CString Left(int nCount ) const;&lt;br /&gt;
CString Right(int nCount ) const;&lt;br /&gt;
&lt;br /&gt;
//возвращает начальный кусок строки, в котором есть только&lt;br /&gt;
//символы из набора,представленного в lpszCharSet&lt;br /&gt;
CString SpanIncluding(LPCTSTR lpszCharSet ) const;&lt;br /&gt;
&lt;br /&gt;
//возвращает начальный кусок строки, в котором нет&lt;br /&gt;
//символов из набора,представленного в lpszCharSet&lt;br /&gt;
CString SpanExcluding(LPCTSTR lpszCharSet ) const; &lt;br /&gt;
&lt;br /&gt;
//убирает &amp;quot;пробелоподобные&amp;quot; символы из самого начала строки&lt;br /&gt;
//(то есть - пробел, табуляцию (\t) , возврат каретки, перевод строки (/r/n))&lt;br /&gt;
void TrimLeft();&lt;br /&gt;
//убирает все повторы символа из самого начала строки&lt;br /&gt;
void TrimLeft(TCHAR chTarget );&lt;br /&gt;
//убирает из самого начала строки все символа из набора lpszTargets &lt;br /&gt;
void TrimLeft(LPCTSTR lpszTargets ); &lt;br /&gt;
&lt;br /&gt;
void TrimRight();&lt;br /&gt;
void TrimRight(TCHAR chTarget );&lt;br /&gt;
void TrimRight(LPCTSTR lpszTargets ); &lt;br /&gt;
&lt;br /&gt;
//поиск в строке&lt;br /&gt;
int Find( TCHAR ch ) const;&lt;br /&gt;
int Find( LPCTSTR lpszSub ) const;&lt;br /&gt;
int Find( TCHAR ch, int nStart ) const;&lt;br /&gt;
int Find( LPCTSTR pstr, int nStart ) const;&lt;br /&gt;
&lt;br /&gt;
//поиск, начиная с конца&lt;br /&gt;
int ReverseFind( TCHAR ch ) const;&lt;br /&gt;
&lt;br /&gt;
//поиск позиции первого символа, одного из набора,&lt;br /&gt;
// представленного в lpszCharSet&lt;br /&gt;
int FindOneOf( LPCTSTR lpszCharSet ) const;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Есть у меня CListBox и я в ходе выполнения программы добавляю в него строки. Но я не могу посмотреть что именно добавляется. Вывод результатов происходит в конце выполнения процедуры...===&lt;br /&gt;
Если нужно делать принудительную перерисовку окна во время&lt;br /&gt;
длительных вычислений, то нужно вызывать для окна, которое&lt;br /&gt;
надо перерисовать метод&lt;br /&gt;
  RedrawWindow()&lt;br /&gt;
с параметрами по умолчанию, или пару&lt;br /&gt;
  Invalidate(0);&lt;br /&gt;
  UpdateWindow();&lt;br /&gt;
Это приводит к пометке всего окна к перерисовке и отправлению&lt;br /&gt;
сообщения WM_PAINT в оконную процедуру в обход очереди&lt;br /&gt;
сообщений, вызывая немедленную перерисовку окна.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CWnd* pw=...;//окно, которое надо перерисовывать&lt;br /&gt;
&lt;br /&gt;
for(int i=0;i&amp;lt;10000)&lt;br /&gt;
{&lt;br /&gt;
	//меняется содержимое окна&lt;br /&gt;
	//...&lt;br /&gt;
&lt;br /&gt;
	//немедленная перерисовка&lt;br /&gt;
	pw-&amp;gt;Invalidate(0);&lt;br /&gt;
	pw-&amp;gt;UpdateWindow();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Я написал DLL, которую используют несколько приложений. Всё вроде работает, но когда происходит очередной вызов функции из DLL, почему то данные в функции обнуляются. С чем это связано?===&lt;br /&gt;
Переменные и массивы в DLL, содержимое которых должно использоваться несколькими процессами, должны объявляться статическими. Статическая переменная или массив инициализируются только один раз в момент загрузки DLL.&lt;br /&gt;
Пример:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DWORD calltest()&lt;br /&gt;
{&lt;br /&gt;
	//будет выполнено только при первом вызове&lt;br /&gt;
	static DWORD callcount=0;&lt;br /&gt;
	static DWORD str[1000]={0}; &lt;br /&gt;
&lt;br /&gt;
	//будет выполняться каждый раз&lt;br /&gt;
	return ++callcount;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Как открыть проекцию файла в память и как с ней работать?===&lt;br /&gt;
Создаем проекцию&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HANDLE CreateFileMapping(&lt;br /&gt;
  HANDLE hFile,	//хендл уже открытого файла&lt;br /&gt;
  LPSECURITY_ATTRIBUTES lpAttributes,&lt;br /&gt;
  DWORD flProtect,	//способ открытия проекции&lt;br /&gt;
  DWORD dwMaximumSizeHigh,	//размер файла (старшие 4 байта , обычно==0)&lt;br /&gt;
  DWORD dwMaximumSizeLow,	//размер файла (младшие 4 байта)&lt;br /&gt;
  LPCTSTR lpName&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Доступ к созданной проекции производится процедурой&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LPVOID MapViewOfFile(&lt;br /&gt;
  HANDLE hFileMappingObject, //хендл проекции&lt;br /&gt;
  DWORD dwDesiredAccess,	//способ работы с проекцией&lt;br /&gt;
  DWORD dwFileOffsetHigh,&lt;br /&gt;
  DWORD dwFileOffsetLow, //смещение от начала файла (младшие 4 байта)&lt;br /&gt;
  SIZE_T dwNumberOfBytesToMap //длина в байтах (если ==0 - то весь файл)&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
далее с файлом можно работать как с обычным массивом в памяти.&lt;br /&gt;
&lt;br /&gt;
После работы с проекцией, её надо освободить процедурой&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
BOOL UnmapViewOfFile(&lt;br /&gt;
  LPCVOID lpBaseAddress //адрес, который вернула процедура MapViewOfFile&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Пример.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HANDLE hMapFile=0;//для проекции&lt;br /&gt;
&lt;br /&gt;
HANDLE hFile=...;//хендл уже открытого файла&lt;br /&gt;
DWORD dwdFileLen=...;//размер открытого файла&lt;br /&gt;
&lt;br /&gt;
//создаём проекцию &amp;quot;только для чтения&amp;quot;&lt;br /&gt;
hMapFile=::CreateFileMapping(hFile,0,PAGE_READONLY,0,dwdFileLen,0);&lt;br /&gt;
&lt;br /&gt;
//хендл hFile можно закрыть уже здесь, в принципе,&lt;br /&gt;
//но мы сделаем это позже&lt;br /&gt;
&lt;br /&gt;
//получаем доступ к проекции (тоже только для чтения)&lt;br /&gt;
BYTE* pbyFile=(BYTE*)::MapViewOfFile(hMapFile,FILE_MAP_READ,0,0,0);&lt;br /&gt;
&lt;br /&gt;
///////////////////&lt;br /&gt;
//тут работаем с массивом pbyFile[dwdFileLen] как с обычным,&lt;br /&gt;
//только не забываем, что он открыт только для чтения&lt;br /&gt;
//...&lt;br /&gt;
//...&lt;br /&gt;
//...&lt;br /&gt;
///////////////////&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//отключаем файл данных от адресного пространства&lt;br /&gt;
UnmapViewOfFile(pbyFile);&lt;br /&gt;
&lt;br /&gt;
//освобождаем хендл проекции&lt;br /&gt;
CloseHandle(hMapFile)&lt;br /&gt;
&lt;br /&gt;
//освобождаем хендл открытого файла&lt;br /&gt;
CloseHandle(hFile);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Использую MFC Grid control 2.25, не получается отобразить картинку в ячейке. Как это делается?===&lt;br /&gt;
Нужно создать список изображений (CImageList), затем передать указатель на список в контрол. Поскольку контрол лишь копирует указатель, список должен создаваться динамически, либо быть членом класса, экземпляр которого существует всё время работы контрола.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 m_GridMarket&lt;br /&gt;
CImageList m_ImageList;&lt;br /&gt;
CGridCtrL m_Grid1&lt;br /&gt;
...&lt;br /&gt;
...&lt;br /&gt;
//неким образом создаётся список&lt;br /&gt;
m_ImageList.Create(...);&lt;br /&gt;
//...&lt;br /&gt;
&lt;br /&gt;
//вставляем в контрол&lt;br /&gt;
m_Grid1.SetImageList(&amp;amp;m_ImageList);&lt;br /&gt;
&lt;br /&gt;
//&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Как при помощи IPicture отобразить картинку из файла? ===&lt;br /&gt;
Пример - несложная функция, отображающая картинку из файла&lt;br /&gt;
&lt;br /&gt;
поддерживаются форматы&lt;br /&gt;
BMP, GIF, JPEG, PNG, TIFF, EMF&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;quot;atlconv.h&amp;quot;&lt;br /&gt;
#define HandleIsValid(H) (H!=(HANDLE)-1 &amp;amp;&amp;amp; H!=(HANDLE)0)&lt;br /&gt;
&lt;br /&gt;
//*pDestDC - CDC, на который предполагается вывод картинки&lt;br /&gt;
//pchzFilePath - путь к файлу&lt;br /&gt;
//pWid - (возвращает) ширина картинки&lt;br /&gt;
//pHig - (возвращает) высота картинки&lt;br /&gt;
bool DrawBitmapFromFile(CDC* pDestDC,const char* pchzFilePath,int *pWid=0,int *pHig=0)&lt;br /&gt;
{&lt;br /&gt;
	bool result=false;&lt;br /&gt;
&lt;br /&gt;
	if(pWid)*pWid=0;&lt;br /&gt;
	if(pHig)*pHig=0;&lt;br /&gt;
&lt;br /&gt;
	int Wid=0;&lt;br /&gt;
	int Hig=0;&lt;br /&gt;
&lt;br /&gt;
	IPicture* pPic=0;&lt;br /&gt;
	try&lt;br /&gt;
	{&lt;br /&gt;
		IPicture* ptmpPic=0;&lt;br /&gt;
		USES_CONVERSION;&lt;br /&gt;
		HRESULT hr;&lt;br /&gt;
&lt;br /&gt;
		CString txt=pchzFilePath;&lt;br /&gt;
		hr= ::OleLoadPicturePath(&lt;br /&gt;
			const_cast&amp;lt;LPOLESTR&amp;gt;(T2COLE(txt)),&lt;br /&gt;
			0,0,0,IID_IPicture,&lt;br /&gt;
			reinterpret_cast&amp;lt;void **&amp;gt;(&amp;amp;ptmpPic)&lt;br /&gt;
			);&lt;br /&gt;
&lt;br /&gt;
		if(hr==S_OK &amp;amp;&amp;amp; ptmpPic)&lt;br /&gt;
		{&lt;br /&gt;
			pPic=ptmpPic;&lt;br /&gt;
		}&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			throw 0;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		OLE_XPOS_HIMETRIC cxSrc;&lt;br /&gt;
		OLE_YPOS_HIMETRIC cySrc;&lt;br /&gt;
&lt;br /&gt;
		if(S_OK!=pPic-&amp;gt;get_Width(&amp;amp;cxSrc))throw 0;&lt;br /&gt;
		if(S_OK!=pPic-&amp;gt;get_Height(&amp;amp;cySrc))throw 0;&lt;br /&gt;
&lt;br /&gt;
		Wid=cxSrc/26;&lt;br /&gt;
		Hig=cySrc/26;&lt;br /&gt;
&lt;br /&gt;
		//рисуем&lt;br /&gt;
		if(S_OK !=pPic-&amp;gt;Render(pDestDC-&amp;gt;GetSafeHdc(),&lt;br /&gt;
			0,Hig,Wid,-Hig,0,0,cxSrc,cySrc,0))throw 0;&lt;br /&gt;
	}&lt;br /&gt;
	catch(...)&lt;br /&gt;
	{&lt;br /&gt;
		result=false;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if(pPic)&lt;br /&gt;
	{&lt;br /&gt;
		pPic-&amp;gt;Release();&lt;br /&gt;
		pPic=0;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	if(pWid)*pWid=Wid;&lt;br /&gt;
	if(pHig)*pHig=Hig;&lt;br /&gt;
&lt;br /&gt;
	return result;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===У меня модальное диалоговое окно, в нем поле редактирования мультилайновое, т.е. чтобы перейти на новую строку надо нажать ентер, но вызывается стандартный обработчик диалогового окна. Подскажите, что делать?===&lt;br /&gt;
Нужно в редакторе ресурсов поставить для CEdit окошка галочку&lt;br /&gt;
свойства WantReturn,&lt;br /&gt;
&lt;br /&gt;
или добавить ES_WANTRETURN при создании CEdit контрола динамически.&lt;br /&gt;
===Как выводят картинку-логотип(splash screen) при запуске программы? То есть, когда загружается программа на экран выводится картинка, потом она исчезает(загрузка программы закончена) и пользователь может приступать к работе ===&lt;br /&gt;
Для этого используется класс, производный от CDialog. Этот диалог после создания показывает себя на экран, выводя на себя рисунок. Также запускает таймер, по срабатывани которого диалог гасится. Создаётся диалог InitInstance приложения.&lt;br /&gt;
&lt;br /&gt;
В VC6++ также есть уже готовый компонент&lt;br /&gt;
Project-&amp;gt;Add To Project -&amp;gt; Components and Controls-&amp;gt;(в папке &amp;quot;Visual C++ Components&amp;quot; есть SplashScreen.)&lt;br /&gt;
&lt;br /&gt;
===Как сделать, чтобы при выпадении списка у ComboBox была не одна строка, а больше, вроде все свойства покрутил, не помогает Вместо выпадающего списка одна строка и скролл...===&lt;br /&gt;
В редакторе ресурсов надо щелкнуть в комбобоксе на треугольнике - появляется рамка для растягивания вниз - размер выпадающего списка.&lt;br /&gt;
===В VC++.net, что делать после того, как на форму установил ActiveX ListView, как объявить класс и переменную для этого элемента?===&lt;br /&gt;
Щёлкнуть правой кнопкой мыши на элементе, в меню - add variable или add class&lt;br /&gt;
&lt;br /&gt;
===Как вставить данные в буфер обмена (Clipboard)? Как их оттуда вытащить?===&lt;br /&gt;
&lt;br /&gt;
1) копирование в буфер обмена:&lt;br /&gt;
&lt;br /&gt;
  1.Готовим данные&lt;br /&gt;
    а.Выделяем память из кучи,  вызывая GlobalAlloc()&lt;br /&gt;
    б.Получаем указатель на выделенную память, вызывая GlobalLock()&lt;br /&gt;
    в.Заполняем данные&lt;br /&gt;
    г.Освобождаем указатель, вызывая GlobalUnlock();&lt;br /&gt;
&lt;br /&gt;
  2.Открываем буфер обмена, вызывая OpenClipboard();&lt;br /&gt;
  3.Очищаем буфер, вызывая EmptyClipboard();&lt;br /&gt;
  4.Вызываем SetClipboardData() один раз для каждого формата&lt;br /&gt;
      вставляемых данных (имеется в виду - если одни и те же&lt;br /&gt;
      данные представлены в разных форматах, и приложение&lt;br /&gt;
      может эти форматы создать)&lt;br /&gt;
  5.Закрываем буфер, вызывая CloseClipboard();&lt;br /&gt;
  6.ВЫЗЫВАТЬ GlobalFree() НЕ НУЖНО, в этом случае это&lt;br /&gt;
      предоставлено системе&lt;br /&gt;
&lt;br /&gt;
Скажем, хотим поместить в буфер обмена текст.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	//готовим данные&lt;br /&gt;
	//выделяем из кучи память для данных&lt;br /&gt;
	HANDLE hglbCopy = GlobalAlloc(GMEM_MOVEABLE,10);&lt;br /&gt;
	if(!hglbCopy)return;&lt;br /&gt;
&lt;br /&gt;
	//получаем указатель&lt;br /&gt;
	void* lpStr = GlobalLock(hglbCopy);&lt;br /&gt;
	if(!lpStr)return;&lt;br /&gt;
&lt;br /&gt;
	//заполняем данные&lt;br /&gt;
	strcpy((char*)lpStr,&amp;quot;my text&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	//освобождаем указатель&lt;br /&gt;
	GlobalUnlock(hglbCopy);&lt;br /&gt;
	lpStr=0;&lt;br /&gt;
&lt;br /&gt;
	//открываем буфер обмена&lt;br /&gt;
	OpenClipboard();&lt;br /&gt;
	//очищаем&lt;br /&gt;
	EmptyClipboard();&lt;br /&gt;
&lt;br /&gt;
	//текстовый формат&lt;br /&gt;
	SetClipboardData(CF_TEXT,hglbCopy);&lt;br /&gt;
&lt;br /&gt;
	//закрываем буфер&lt;br /&gt;
	CloseClipboard();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
2) извлечение из буфера обмена&lt;br /&gt;
&lt;br /&gt;
  1.Проверяем, что поддерживается нужный формат данных,&lt;br /&gt;
      вызывая IsClipboardFormatAvailable()&lt;br /&gt;
  2.Открываем буфер обмена, вызывая OpenClipboard();&lt;br /&gt;
  3.Достаём данные&lt;br /&gt;
   а.Получаем из буфера хендл требуемого формата,&lt;br /&gt;
      вызывая GetClipboardData()&lt;br /&gt;
    б.Получаем указатель на выделенную память, вызывая GlobalLock()&lt;br /&gt;
    в.Работаем с данными&lt;br /&gt;
    г.Освобождаем указатель, вызывая GlobalUnlock();&lt;br /&gt;
  4.Закрываем буфер, вызывая CloseClipboard();&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	//Проверяем, что поддерживается нужный формат данных,&lt;br /&gt;
	if(!IsClipboardFormatAvailable(CF_TEXT))return;&lt;br /&gt;
&lt;br /&gt;
	//открываем буфер обмена&lt;br /&gt;
	OpenClipboard();&lt;br /&gt;
&lt;br /&gt;
	//достаём данные&lt;br /&gt;
&lt;br /&gt;
	//текстовый формат&lt;br /&gt;
	HANDLE hglbCopy = GetClipboardData(CF_TEXT);&lt;br /&gt;
	if(!hglbCopy)return;&lt;br /&gt;
&lt;br /&gt;
	//получаем указатель&lt;br /&gt;
	void* lpStr = GlobalLock(hglbCopy);&lt;br /&gt;
	if(!lpStr)return;&lt;br /&gt;
&lt;br /&gt;
	//читаем данные&lt;br /&gt;
	char data[10];&lt;br /&gt;
	memmove(data,lpStr,sizeof(data));&lt;br /&gt;
&lt;br /&gt;
	//освобождаем указатель&lt;br /&gt;
	GlobalUnlock(hglbCopy);&lt;br /&gt;
	lpStr=0;&lt;br /&gt;
&lt;br /&gt;
	//закрываем буфер&lt;br /&gt;
	CloseClipboard();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Как получить полный путь к экзешнику из самой программы?===&lt;br /&gt;
В командную строку первым параметром система всегда передаёт заключённый в кавычки полный путь к файлу запущенной программы. Достаём путь таким образом:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
BOOL CMyApp::InitInstance()&lt;br /&gt;
{&lt;br /&gt;
	//добыча полного имени экзешника&lt;br /&gt;
	CString csFullExeName;&lt;br /&gt;
	{&lt;br /&gt;
		CString csAppName=GetCommandLine();&lt;br /&gt;
		csAppName.Delete(0,1);&lt;br /&gt;
		csAppName.Replace('\&amp;quot;','\0');&lt;br /&gt;
		csFullExeName=(const char*)csAppName;&lt;br /&gt;
	}&lt;br /&gt;
	//теперь csFullExeName - содержит искомый путь&lt;br /&gt;
&lt;br /&gt;
	//...&lt;br /&gt;
	//...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Каким способом exe файл может заменить самого себя? То есть, моя программа обновляется, например, через Internet, и хочет обновить свой exe-файл. Но так как он в данный момент запущен - это будет, естественно, запрещено. Как это можно проще всего сделать?===&lt;br /&gt;
Один из способов - сделать копию экзешника и из него обновиться&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define def_exeNAMEup	&amp;quot;c:\\myprog_update.exe&amp;quot;&lt;br /&gt;
#define def_exeNAMEdnld	&amp;quot;c:\\myprog_downloaded.exe&amp;quot;&lt;br /&gt;
#define def_keyUdate	&amp;quot;/update&amp;quot;&lt;br /&gt;
&lt;br /&gt;
void CTESTFAQApp::UpdateItself()&lt;br /&gt;
{&lt;br /&gt;
	//добыча полного имени экзешника&lt;br /&gt;
	CString csFullExeName;&lt;br /&gt;
	{&lt;br /&gt;
		CString csAppName=GetCommandLine();&lt;br /&gt;
		csAppName.Delete(0,1);&lt;br /&gt;
		csAppName.Replace('\&amp;quot;','\0');&lt;br /&gt;
		csFullExeName=(const char*)csAppName;&lt;br /&gt;
	}&lt;br /&gt;
	//теперь csFullExeName - содержит искомый путь&lt;br /&gt;
&lt;br /&gt;
	//делаем копию экзешника с другим именем&lt;br /&gt;
	CopyFile(csFullExeName,def_exeNAMEup,0);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	//передаём в параметры нового процесса ключ и путь к текущему файлу&lt;br /&gt;
	CString csParams=def_keyUdate;&lt;br /&gt;
	csParams+=&amp;quot; &amp;quot;;&lt;br /&gt;
	csParams+=csFullExeName;&lt;br /&gt;
&lt;br /&gt;
	//запускаем копию&lt;br /&gt;
	STARTUPINFO si;&lt;br /&gt;
	PROCESS_INFORMATION pi;&lt;br /&gt;
	ZeroMemory(&amp;amp;si,sizeof(si));&lt;br /&gt;
	si.cb = sizeof(si);&lt;br /&gt;
	ZeroMemory(&amp;amp;pi,sizeof(pi));&lt;br /&gt;
	if(CreateProcess(def_exeNAMEup,def_keyUdate,0,0,0,0,0,0,&amp;amp;si,&amp;amp;pi))&lt;br /&gt;
	{&lt;br /&gt;
		//завершаем текущий процесс&lt;br /&gt;
		ExitFromMyApp();&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void CTESTFAQApp::ExitFromMyApp()&lt;br /&gt;
{&lt;br /&gt;
	exit(0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
BOOL CTESTFAQApp::InitInstance()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
	//смотрим, не запустили ли для апдейта?&lt;br /&gt;
&lt;br /&gt;
	CString txt;&lt;br /&gt;
	txt=m_lpCmdLine;&lt;br /&gt;
	if(txt.Find(def_keyUdate)==0)&lt;br /&gt;
	{&lt;br /&gt;
		//делаем айдейт&lt;br /&gt;
		txt.Replace(def_keyUdate,&amp;quot;&amp;quot;);&lt;br /&gt;
		txt.TrimLeft();&lt;br /&gt;
&lt;br /&gt;
		CString csFullExeName=txt;&lt;br /&gt;
&lt;br /&gt;
		//берём откуда то уже скачанный файл обновления&lt;br /&gt;
		//...&lt;br /&gt;
		CString csFull_Downloaded_ExeName=def_exeNAMEdnld;&lt;br /&gt;
&lt;br /&gt;
		//копируем файл (обновляем старый то есть)&lt;br /&gt;
		CopyFile(csFull_Downloaded_ExeName,csFullExeName,0);&lt;br /&gt;
&lt;br /&gt;
		//запускаем обновлённого мученника&lt;br /&gt;
		STARTUPINFO si;&lt;br /&gt;
		PROCESS_INFORMATION pi;&lt;br /&gt;
		ZeroMemory(&amp;amp;si,sizeof(si));&lt;br /&gt;
		si.cb = sizeof(si);&lt;br /&gt;
		ZeroMemory(&amp;amp;pi,sizeof(pi));&lt;br /&gt;
		if(CreateProcess(csFullExeName,0,0,0,0,0,0,0,&amp;amp;si,&amp;amp;pi))&lt;br /&gt;
&lt;br /&gt;
		ExitFromMyApp();&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
	//...&lt;br /&gt;
	//...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Есть строка символов (страничка из Инета) в кодировке utf-8 (строка char*). Как мне ее получить в формате String&lt;br /&gt;
или в char* в кодировке ANSI (cp 1251) ?===&lt;br /&gt;
Можно перевести строку из UTF8 в Unicode, затем из Unicode в 1251&lt;br /&gt;
&lt;br /&gt;
Ниже приведена структура, содержащая процедуры перекодирования,&lt;br /&gt;
а также процедуру с примером использования&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//описание структуры&lt;br /&gt;
struct coder&lt;br /&gt;
{&lt;br /&gt;
	//utf8-&amp;gt;unicode&lt;br /&gt;
	static wchar_t* utf8_to_unicode__dontForgetDeleteArr(const char *utf8_string)&lt;br /&gt;
	{&lt;br /&gt;
		wchar_t* pRes=0;&lt;br /&gt;
		int res_len=0;&lt;br /&gt;
&lt;br /&gt;
		//тест на возможность преобразования&lt;br /&gt;
		res_len=MultiByteToWideChar(CP_UTF8,0,utf8_string,-1,0,0);&lt;br /&gt;
		if(!res_len)return 0;&lt;br /&gt;
&lt;br /&gt;
		//выделяем память&lt;br /&gt;
		pRes = new wchar_t[res_len];&lt;br /&gt;
		if(!pRes)return 0;&lt;br /&gt;
&lt;br /&gt;
		//преобразование&lt;br /&gt;
		if(!MultiByteToWideChar(CP_UTF8,0,utf8_string,-1,pRes,res_len))&lt;br /&gt;
		{&lt;br /&gt;
			delete [] pRes;&lt;br /&gt;
			return 0;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		return pRes;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	//unicode-&amp;gt;1251&lt;br /&gt;
	static char * unicode_to_1251__dontForgetDeleteArr(const wchar_t *unicode_string)&lt;br /&gt;
	{&lt;br /&gt;
		char* pRes=0;&lt;br /&gt;
		int res_len=0;&lt;br /&gt;
&lt;br /&gt;
		//тест на возможность преобразования&lt;br /&gt;
		res_len = WideCharToMultiByte(1251,0,unicode_string,-1,0,0,0,0);&lt;br /&gt;
		if(!res_len)return 0;&lt;br /&gt;
&lt;br /&gt;
		//выделяем память&lt;br /&gt;
		pRes=new char[res_len];&lt;br /&gt;
		if(!pRes)return 0;&lt;br /&gt;
&lt;br /&gt;
		//преобразование&lt;br /&gt;
		if(!WideCharToMultiByte(1251,0,unicode_string,-1,pRes,res_len,0,0))&lt;br /&gt;
		{&lt;br /&gt;
			delete [] pRes;&lt;br /&gt;
			return 0;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		return pRes;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	//процедура с примером&lt;br /&gt;
	static void Example()&lt;br /&gt;
	{&lt;br /&gt;
		wchar_t* unicode_string=0;&lt;br /&gt;
		char* cp1251_string=0;&lt;br /&gt;
&lt;br /&gt;
		//исходный текст&lt;br /&gt;
		char utf8_string[] = &amp;quot;UTF-8 + СЂСѓСЃСЃРєРёР№ С‚РµРєСЃС‚&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
		for(;;)&lt;br /&gt;
		{&lt;br /&gt;
&lt;br /&gt;
			unicode_string=utf8_to_unicode__dontForgetDeleteArr(utf8_string);&lt;br /&gt;
			if(!unicode_string)&lt;br /&gt;
			{&lt;br /&gt;
				AfxMessageBox(&amp;quot;Не удалось конвертировать в unicode!&amp;quot;);&lt;br /&gt;
				break;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			cp1251_string = unicode_to_1251__dontForgetDeleteArr(unicode_string);&lt;br /&gt;
&lt;br /&gt;
			if(!cp1251_string)&lt;br /&gt;
			{&lt;br /&gt;
				AfxMessageBox(&amp;quot;Не удалось конвертировать из unicode!&amp;quot;);&lt;br /&gt;
				break;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			break;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		//cp1251_string - результат&lt;br /&gt;
		AfxMessageBox(cp1251_string);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
		//не забываем удалить массивы&lt;br /&gt;
		if(unicode_string)&lt;br /&gt;
		{&lt;br /&gt;
			delete [] unicode_string;&lt;br /&gt;
			unicode_string=0;&lt;br /&gt;
		}&lt;br /&gt;
		if(cp1251_string)&lt;br /&gt;
		{&lt;br /&gt;
			delete [] cp1251_string;&lt;br /&gt;
			cp1251_string=0;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
//вызов примера&lt;br /&gt;
coder::Example();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Как организовать взаимодействие программы на VC.net с Access-овской базой данных?===&lt;br /&gt;
Проще всего подключить ADO компоненты и сделать все на них.&lt;br /&gt;
Компоненты  ADO (ADODC,DATAGRID и т.п.) это ActiveX.&lt;br /&gt;
В редакторе ресурсов, во всплывающем меню, есть Insert ActiveX Control -&amp;gt; открывается список всех компоент,&lt;br /&gt;
зарегистрированых на машине. Нужно найти компоненты (Это компоненты от MS и они помечены (OLEDB)) и вставить их в диалог. Для того что бы иметь возможность управлять ими, нужно импортировать обертки для них, это делается при помощи ClassWisard, там есть импорт-&amp;gt;класс-&amp;gt;указать файл с компоентой (OSX).&lt;br /&gt;
Появляется список всех классов, объявленых внутри.&lt;br /&gt;
Проставляем галочки, нажимаем ОК.&lt;br /&gt;
&lt;br /&gt;
[[Category:FAQ]]&lt;/div&gt;</summary>
		<author><name>Mczim</name></author>	</entry>

	<entry>
		<id>https://wiki.shelek.ru/index.php?title=FAQ:WinAPI,_VCPP_Part_3&amp;diff=423</id>
		<title>FAQ:WinAPI, VCPP Part 3</title>
		<link rel="alternate" type="text/html" href="https://wiki.shelek.ru/index.php?title=FAQ:WinAPI,_VCPP_Part_3&amp;diff=423"/>
				<updated>2008-08-14T19:05:53Z</updated>
		
		<summary type="html">&lt;p&gt;Mczim: пробел перед знаком вопроса в заголовке&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Имеется приложение на основе CRichEditView. Как узнать, что пользователь меняет текст?===&lt;br /&gt;
Добавить обработчик сообщения EN_CHANGE. Сообщение генерируется CRichEditView каждый раз, когда пользователь изменяет текст в окне CRichEditView&lt;br /&gt;
===Чем метод CArray::GetSize отличается от метода CArray::GetCount?===&lt;br /&gt;
Абсолютно ничем. (Скорее всего, были предыдущие библиотеки, в которых функции, одинаковые по смыслу, имели разные имена. Поэтому в целях совместимости оставили оба)&lt;br /&gt;
===Как загрузить строку из ресурса?===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CString m_Temp;&lt;br /&gt;
m_Temp.LoadString(ID_MYSTRING);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как поменять иконку у элемента (item) в CListCtrl?===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//заполняем структуру LVITEM&lt;br /&gt;
LVITEM lvItem;&lt;br /&gt;
memset(&amp;amp;lvItem,0,sizeof(lvItem));&lt;br /&gt;
	&lt;br /&gt;
lvItem.mask = LVIF_IMAGE;//меняться будет картинка&lt;br /&gt;
lvItem.iItem = ...;// индекс элемента списка (Zero-based)&lt;br /&gt;
lvItem.iSubItem = 0;&lt;br /&gt;
lvItem.iImage = ...; //индекс иконки (из списка контрола)&lt;br /&gt;
	&lt;br /&gt;
pList-&amp;gt;SetItem(&amp;amp; lvItem);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Имеется класс Class1, содержащий мембер типа указатель на Class2. В Class2 также имеется указатель на Class1. Компилятор выдаёт ошибку. Что надо делать?===&lt;br /&gt;
Предварительно объявляем класс Class2. Тогда компилятору будет известно, что описание класса Class2 будет встречено дальше, и станет возможным объявление указателей на класс до описания самого класса.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Class2;//предопределение&lt;br /&gt;
	&lt;br /&gt;
Class1&lt;br /&gt;
{&lt;br /&gt;
	Class2* p;&lt;br /&gt;
};&lt;br /&gt;
	&lt;br /&gt;
Class2&lt;br /&gt;
{&lt;br /&gt;
	Class1* p;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как переключить раскладку в другом (то есть в активном) процессе?===&lt;br /&gt;
Использовать функции:&lt;br /&gt;
   GetKeyboardLayout - определить текущую раскладку&lt;br /&gt;
   LoadKeyboardLayout - загрузить новую раскладку&lt;br /&gt;
&lt;br /&gt;
см.также&lt;br /&gt;
   VerLanguageName - получить строку с описанием языка&lt;br /&gt;
&lt;br /&gt;
(подробности - в MSDN)&lt;br /&gt;
===Как получить хендл контрола Edit зная его ID?===&lt;br /&gt;
Пусть контрол лежит на окне CMyWnd&lt;br /&gt;
Тогда:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void CMyWnd::некая_процедура()&lt;br /&gt;
{&lt;br /&gt;
	//для MFC&lt;br /&gt;
	CEdit* ed=(CEdit* ) GetDlgItem(ID_EDIT1);&lt;br /&gt;
	HWND hwnd=ed-&amp;gt;GetSafeHwnd();&lt;br /&gt;
	...&lt;br /&gt;
	&lt;br /&gt;
	//для Win32 API&lt;br /&gt;
	HWND hwnd=GetDlgItem(m_hWnd,ID_EDIT1);&lt;br /&gt;
	...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Как из дочернего окна закрыть приложение?===&lt;br /&gt;
Нужно послать родительскому окну (*pParent) сообщение WM_CLOSE:&lt;br /&gt;
 pParent-&amp;gt;PostMessage(WM_CLOSE);//MFC&lt;br /&gt;
или&lt;br /&gt;
 ::PostMessage(pParent-&amp;gt;m_hWnd,WM_CLOSE,(WPARAM)0,(LPARAM)0);//API&lt;br /&gt;
===Как корректно перевести BSTR в CString и наоборот?===&lt;br /&gt;
Нужно просто присвоить переменной типа CString переменную типа BSTR.&lt;br /&gt;
Оператор = класса CString сам всё переведёт.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//указатель на будущий буфер с BSTR.&lt;br /&gt;
//	(По сути, BSTR определён как &lt;br /&gt;
//	typedef WCHAR* BSTR;&lt;br /&gt;
//	то есть указатель на 16-битный символ юникод)&lt;br /&gt;
	&lt;br /&gt;
BSTR bstrHE=0;&lt;br /&gt;
	&lt;br /&gt;
CString Str=&amp;quot;мой текст&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
//Выделить память и загрузить адрес блока в bstrHE&lt;br /&gt;
bstrHE=Str.AllocSysString();&lt;br /&gt;
	&lt;br /&gt;
//...	&lt;br /&gt;
//тут работаем с bstrHE[]&lt;br /&gt;
//...&lt;br /&gt;
	&lt;br /&gt;
//освобождаем память&lt;br /&gt;
SysFreeString(bstrHE);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Как получить доступ к графическим ресурсам элементов текущей темы оформления Windows?===&lt;br /&gt;
Использовать функции&lt;br /&gt;
&lt;br /&gt;
OpenThemeData()&lt;br /&gt;
DrawThemeBackground()&lt;br /&gt;
DrawFrameControl()&lt;br /&gt;
CloseThemeData().&lt;br /&gt;
&lt;br /&gt;
(подробности - в MSDN)&lt;br /&gt;
===Имеется класс , производный от CDialog. Когда диалог в фокусе, нажатие на Enter или Esc приводит к закрытию диалога. Как это запретить?===&lt;br /&gt;
При нажатии Enter происходит выполнение команды IDOK,&lt;br /&gt;
при нажатии Esc - IDCANCEL.&lt;br /&gt;
Нужно переопределить в классе виртуальные функции OnOk() и OnCancel(),&lt;br /&gt;
которые соответственно вызываются для этих команд. При помощи&lt;br /&gt;
визарда эти функции добавить можно так: Положить на диалог две кнопки&lt;br /&gt;
с идентификаторами IDOK и IDCANCEL (при создании нового диалога они там&lt;br /&gt;
есть сразу), затем двойной клик по кнопке добавляет соответствующий&lt;br /&gt;
обработчик. В обработчиках надо удалить вызовы СDialog::OnOK() и&lt;br /&gt;
CDialog::OnCancel(), тогда диалог закрываться не будет.&lt;br /&gt;
Однако тогда диалог станет невозможно закрыть кнопкой с крестиком  :)&lt;br /&gt;
&lt;br /&gt;
Лечить так: добавить обработчик сообщения WM_CLOSE - OnClose(), и в нём&lt;br /&gt;
сделать вызов OnOk() или OnCancel() :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void CPlayersPropsDialog::OnClose() &lt;br /&gt;
{&lt;br /&gt;
	CDialog::OnClose();&lt;br /&gt;
	CDialog::OnCancel();//добавлено&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===VC++6. Я написал простейший макрос, а компилятор на него ругается. Ума не приложу, что за глюк?===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	#define my_macr(x,y,z) \&lt;br /&gt;
		z=\&lt;br /&gt;
		(x+y)*\&lt;br /&gt;
		(x-y)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Скорее всего после одного из символов соединения строк &amp;quot;\&amp;quot; имеется&lt;br /&gt;
пробел или табуляция. Их надо удалить. Можно найти их &amp;quot;наощупь&amp;quot;, а&lt;br /&gt;
можно включить показ непечатных символов в студии. Найти эту команду&lt;br /&gt;
можно так:&lt;br /&gt;
Tools-&amp;gt;Customize...-&amp;gt;вкладка Commands. В окошке Category выбрать&lt;br /&gt;
&amp;quot;Edit&amp;quot;, и среди кнопок справа найти кнопку, на которой написано &amp;quot;a.b&amp;quot;&lt;br /&gt;
Эту кнопку надо перетащить на одну из панелей инструментов студии.&lt;br /&gt;
&lt;br /&gt;
===Как получить список всех процесов, включая idle?===&lt;br /&gt;
Использовать функции&lt;br /&gt;
Process32First()&lt;br /&gt;
Precess32Next()&lt;br /&gt;
&lt;br /&gt;
===Как программно установить переменные окружения?===&lt;br /&gt;
Чтобы добавить или изменить их программно, необходимо воспользоваться&lt;br /&gt;
ключом реестра HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\&lt;br /&gt;
Session Manager\Environment, а затем отправить широковещательное&lt;br /&gt;
сообщение WM_SETTINGCHANGE. Это позволит приложениям узнать об&lt;br /&gt;
изменениях:&lt;br /&gt;
&lt;br /&gt;
::SendMessage(HWND_BROADCAST,WM_SETTINGCHANGE,0,0);&lt;br /&gt;
===Как сделать, чтобы у окна был черный фон?===&lt;br /&gt;
переопределить обработчик сообщения WM_CTLCOLOR - OnCtlColor() :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CBrush br(RGB(0,0,0));&lt;br /&gt;
	&lt;br /&gt;
HBRUSH CMyDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) &lt;br /&gt;
{&lt;br /&gt;
	HBRUSH hbr = CMyDlg::OnCtlColor(pDC, pWnd, nCtlColor);&lt;br /&gt;
	&lt;br /&gt;
	//фон диалога (или вьюшки)&lt;br /&gt;
	if(nCtlColor==CTLCOLOR_DLG)&lt;br /&gt;
	{&lt;br /&gt;
		return (HBRUSH)br;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	//фон статиков (если нужно)&lt;br /&gt;
	if(nCtlColor==CTLCOLOR_STATIC)&lt;br /&gt;
	{&lt;br /&gt;
		//делаем фон текста статика прозрачным&lt;br /&gt;
		pDC-&amp;gt;SetBkMode(TRANSPARENT);&lt;br /&gt;
		return (HBRUSH)br;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	return hbr;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Почему на моем компьютере экзешник, созданный в MFC запускается, а на других компьютерах - нет? Требует какую-то  dll-ку.===&lt;br /&gt;
Нужно выбирать режим Release :&lt;br /&gt;
&lt;br /&gt;
Menu-&amp;gt;Build-&amp;gt;Configurations...-&amp;gt;Release,&lt;br /&gt;
&lt;br /&gt;
и экзешник, соответственно, брать из папки Release проекта&lt;br /&gt;
===Как в диалог добавить меню?===&lt;br /&gt;
Надо сделать в ресурсах меню, затем вставить в диалог:&lt;br /&gt;
&lt;br /&gt;
открыть в редакторе диалог, в свойствах (во вкладке General, окошко Menu) указать идентивикатор ресурса меню.&lt;br /&gt;
При помощи визарда добавить для меню обработчики OnCommand() и OnUpdateСommand().&lt;br /&gt;
===Я добавил визардом меню в диалог. Добавил обработчики для пунктов меню. Пункты работают, но OnUpdate для пунктов не вызывается - то есть не получается ни затенить, ни чек поставить. Что делать?===&lt;br /&gt;
В диалоге у меню апдейта не происходит сам, в отличие от мейнфрейма.&lt;br /&gt;
Для этого нужно сделать самим апдейт в обработчике сообщения WM_KICKIDLE.&lt;br /&gt;
Визардом обработчик не добавляется, поэтому можно переопределить виртуальную DefWindowProc() и там обработать:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;afxpriv.h&amp;gt;	//этот файл надо включить, там определёна WM_KICKIDLE&lt;br /&gt;
&lt;br /&gt;
LRESULT CMyDialog::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam) &lt;br /&gt;
{&lt;br /&gt;
	if(message==WM_KICKIDLE)&lt;br /&gt;
	{&lt;br /&gt;
		//делаем апдейт для всех пунктов меню&lt;br /&gt;
		CMenu* pMainMenu=GetMenu();&lt;br /&gt;
		if(pMainMenu)&lt;br /&gt;
		{&lt;br /&gt;
			CCmdUI cmdUI;&lt;br /&gt;
			for (UINT n=0; n &amp;lt; pMainMenu-&amp;gt;GetMenuItemCount(); ++n)&lt;br /&gt;
			{&lt;br /&gt;
				CMenu* pSubMenu = pMainMenu-&amp;gt;GetSubMenu(n);&lt;br /&gt;
				if(!pSubMenu)continue;&lt;br /&gt;
	&lt;br /&gt;
				cmdUI.m_nIndexMax = pSubMenu-&amp;gt;GetMenuItemCount();&lt;br /&gt;
				for (UINT i = 0; i &amp;lt; cmdUI.m_nIndexMax;++i)&lt;br /&gt;
				{&lt;br /&gt;
					cmdUI.m_nIndex = i;&lt;br /&gt;
					cmdUI.m_nID = pSubMenu-&amp;gt;GetMenuItemID(i);&lt;br /&gt;
					cmdUI.m_pMenu = pSubMenu;&lt;br /&gt;
					cmdUI.DoUpdate(this, FALSE);&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	return CDialog::DefWindowProc(message, wParam, lParam);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Как на Visual C++ 6.0 в Главном окне отключить системное меню (в левом верхнем углу) и кнопки(в правом верхнем углу)?===&lt;br /&gt;
При создании окна нужно убрать стиль WS_SYSMENU&lt;br /&gt;
(теперь пользователь корректно может закрыть окно только Alt+F4,&lt;br /&gt;
ну или если вы предоставите ему дополнительную возможность сделать это)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пример 1. (для SDI, MDI)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//этот обработчик уже добавлен визардом&lt;br /&gt;
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT&amp;amp; cs)&lt;br /&gt;
{&lt;br /&gt;
	if( !CFrameWnd::PreCreateWindow(cs) )&lt;br /&gt;
		return FALSE;&lt;br /&gt;
	// TODO: Modify the Window class or styles here by modifying&lt;br /&gt;
	//  the CREATESTRUCT cs&lt;br /&gt;
&lt;br /&gt;
	///////////////////////////////&lt;br /&gt;
	//добавленная часть&lt;br /&gt;
	{&lt;br /&gt;
		//убираем стиль&lt;br /&gt;
		cs.style&amp;amp;=~WS_SYSMENU;&lt;br /&gt;
	}&lt;br /&gt;
	///////////////////////////////&lt;br /&gt;
&lt;br /&gt;
	return TRUE;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Пример 2. (для диалога)&lt;br /&gt;
Если диалог описан в ресурсах, то в свойствах диалога убрать галочки&lt;br /&gt;
  &amp;quot;System menu&amp;quot;&lt;br /&gt;
  &amp;quot;Minimize box&amp;quot;&lt;br /&gt;
  &amp;quot;Maximize box&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===Хочу сделать так, чтобы пользователь не мог нажать на кнопку, пока программа не разрешит.===&lt;br /&gt;
Нужно применить метод класса CWnd::EnableWindow(...) для кнопки.&lt;br /&gt;
Значение параметра 0 делает кнопку неактивной, 1 - делает активной.&lt;br /&gt;
(кстате, не только для кнопки можно, а для любого класса, производного&lt;br /&gt;
от класса CWnd)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пусть имеется некий диалог, на нём лежит кнопка c ID == IDC_1.&lt;br /&gt;
в любом месте кода диалога (кроме конструктора и деструктора , хотя, если&lt;br /&gt;
проверить наличие валидного хендла диалога, как в примере, то ничего&lt;br /&gt;
страшного не будет и там)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//делаем кнопку неактивной&lt;br /&gt;
if(m_hWnd)&lt;br /&gt;
{&lt;br /&gt;
	CWnd* pw=0;&lt;br /&gt;
	pw=GetDlgItem(IDC_1);&lt;br /&gt;
	if(pw)pw-&amp;gt;EnableWindow(0);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Что означают сообщения, которые студия выводит при компиляции, вроде таких : Loaded 'C:\WINDOWS\SYSTEM\WSOCK32.DLL', no matching symbolic information found. ===&lt;br /&gt;
Это строка говорит о том, что студия не смогла найти отладочные&lt;br /&gt;
символы для WSOCK32.DLL. В этом нет ничего страшного, просто при наличии&lt;br /&gt;
отладочных символов в процессе отладки можно получить доступ к именам&lt;br /&gt;
функции из системных DLL. Например, вместо&lt;br /&gt;
 KERNEL32! 0x77E8B184() -&lt;br /&gt;
 увидим&lt;br /&gt;
 KERNEL32!CreateThread.&lt;br /&gt;
===Как обработать сообщения, которое приходит к некому контролу (скажем CEdit)?===&lt;br /&gt;
Нужно произвести от CEdit свой класс, и в виртуальной процедуре класса WindowProc перехватить нужные сообщения.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
virtual LRESULT WindowProc(&lt;br /&gt;
   UINT message,&lt;br /&gt;
   WPARAM wParam,&lt;br /&gt;
   LPARAM lParam &lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Пример. Полностью выключаем, скажем, обработку сообщения WM_CHAR&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	LRESULT CMyEdit::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) &lt;br /&gt;
	{&lt;br /&gt;
		switch(message)&lt;br /&gt;
		{&lt;br /&gt;
			case WM_CHAR:&lt;br /&gt;
			{&lt;br /&gt;
				return 0;&lt;br /&gt;
			}&lt;br /&gt;
			break;&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		return CEdit::WindowProc(message, wParam, lParam);&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Чтобы связать экземпляр класса с контролом на форме, добавьте визардом для&lt;br /&gt;
контрола переменную класса (выбрав не Value а Control).&lt;br /&gt;
&lt;br /&gt;
===Как настроить количество пробелов в табуляции?===&lt;br /&gt;
Tools-&amp;gt;Options-&amp;gt;Tabs-&amp;gt;Insert Spaces&lt;br /&gt;
(или  правой кнопкой мыши по тексту-&amp;gt; properties)&lt;br /&gt;
===Как автоматически расставить отступы?===&lt;br /&gt;
Выделить текст для форматирования, нажать Alt+F8&lt;br /&gt;
&lt;br /&gt;
Есть ещё программа Artistic Style, которая занимается&lt;br /&gt;
переформатированием кода&lt;br /&gt;
http://sourceforge.net/projects/astyle/&lt;br /&gt;
===Поиск границ блока===&lt;br /&gt;
&amp;quot;CTRL+ }&amp;quot; ищет парную фигурную скобку в тексте и переходит на неё&lt;br /&gt;
===Вертикальное выделение текста===&lt;br /&gt;
&amp;quot;Alt + выделение мышкой&amp;quot; - позволяет выделять вертикальные фрагменты текста&lt;br /&gt;
===Как узнать количество установленных в CListCtrl столбцов?===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CListCtrl* pL=...; //указатель на переменную-контрол&lt;br /&gt;
&lt;br /&gt;
int count=pL-&amp;gt;GetHeaderCtrl()-&amp;gt;GetItemCount();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Как получить иконку приложения?===&lt;br /&gt;
Если приложение запущено, то нужно найти его главное окно и&lt;br /&gt;
послать ему сообщение WM_GETICON.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//функция возвращант хендл иконки &lt;br /&gt;
LRESULT SendMessage(hWnd, WM_GETICON, wParam, 0);&lt;br /&gt;
&lt;br /&gt;
//hWnd == хендл окна приложения&lt;br /&gt;
//wParam == &lt;br /&gt;
//	1)==ICON_BIG - получить большую иконку&lt;br /&gt;
//	2)==ICON_SMALL - получить маленькую иконку&lt;br /&gt;
//	3)==ICON_SMALL2 - получить маленькую иконку, если она определена&lt;br /&gt;
//				в приложении. Если её нет, то маленькую иконку, &lt;br /&gt;
//				сгенерированную системой из большой иконки&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как в CString можно найти или вырезать часть строки?===&lt;br /&gt;
есть такие методы в CString:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//вырезает кусок строки&lt;br /&gt;
CString Mid(int nFirst) const;&lt;br /&gt;
CString Mid(int nFirst,  int nCount) const;&lt;br /&gt;
&lt;br /&gt;
//возвращает кусок строки (сначала или с конца)&lt;br /&gt;
CString Left(int nCount ) const;&lt;br /&gt;
CString Right(int nCount ) const;&lt;br /&gt;
&lt;br /&gt;
//возвращает начальный кусок строки, в котором есть только&lt;br /&gt;
//символы из набора,представленного в lpszCharSet&lt;br /&gt;
CString SpanIncluding(LPCTSTR lpszCharSet ) const;&lt;br /&gt;
&lt;br /&gt;
//возвращает начальный кусок строки, в котором нет&lt;br /&gt;
//символов из набора,представленного в lpszCharSet&lt;br /&gt;
CString SpanExcluding(LPCTSTR lpszCharSet ) const; &lt;br /&gt;
&lt;br /&gt;
//убирает &amp;quot;пробелоподобные&amp;quot; символы из самого начала строки&lt;br /&gt;
//(то есть - пробел, табуляцию (\t) , возврат каретки, перевод строки (/r/n))&lt;br /&gt;
void TrimLeft();&lt;br /&gt;
//убирает все повторы символа из самого начала строки&lt;br /&gt;
void TrimLeft(TCHAR chTarget );&lt;br /&gt;
//убирает из самого начала строки все символа из набора lpszTargets &lt;br /&gt;
void TrimLeft(LPCTSTR lpszTargets ); &lt;br /&gt;
&lt;br /&gt;
void TrimRight();&lt;br /&gt;
void TrimRight(TCHAR chTarget );&lt;br /&gt;
void TrimRight(LPCTSTR lpszTargets ); &lt;br /&gt;
&lt;br /&gt;
//поиск в строке&lt;br /&gt;
int Find( TCHAR ch ) const;&lt;br /&gt;
int Find( LPCTSTR lpszSub ) const;&lt;br /&gt;
int Find( TCHAR ch, int nStart ) const;&lt;br /&gt;
int Find( LPCTSTR pstr, int nStart ) const;&lt;br /&gt;
&lt;br /&gt;
//поиск, начиная с конца&lt;br /&gt;
int ReverseFind( TCHAR ch ) const;&lt;br /&gt;
&lt;br /&gt;
//поиск позиции первого символа, одного из набора,&lt;br /&gt;
// представленного в lpszCharSet&lt;br /&gt;
int FindOneOf( LPCTSTR lpszCharSet ) const;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Есть у меня CListBox и я в ходе выполнения программы добавляю в него строки. Но я не могу посмотреть что именно добавляется. Вывод результатов происходит в конце выполнения процедуры...===&lt;br /&gt;
Если нужно делать принудительную перерисовку окна во время&lt;br /&gt;
длительных вычислений, то нужно вызывать для окна, которое&lt;br /&gt;
надо перерисовать метод&lt;br /&gt;
  RedrawWindow()&lt;br /&gt;
с параметрами по умолчанию, или пару&lt;br /&gt;
  Invalidate(0);&lt;br /&gt;
  UpdateWindow();&lt;br /&gt;
Это приводит к пометке всего окна к перерисовке и отправлению&lt;br /&gt;
сообщения WM_PAINT в оконную процедуру в обход очереди&lt;br /&gt;
сообщений, вызывая немедленную перерисовку окна.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CWnd* pw=...;//окно, которое надо перерисовывать&lt;br /&gt;
&lt;br /&gt;
for(int i=0;i&amp;lt;10000)&lt;br /&gt;
{&lt;br /&gt;
	//меняется содержимое окна&lt;br /&gt;
	//...&lt;br /&gt;
&lt;br /&gt;
	//немедленная перерисовка&lt;br /&gt;
	pw-&amp;gt;Invalidate(0);&lt;br /&gt;
	pw-&amp;gt;UpdateWindow();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Я написал DLL, которую используют несколько приложений. Всё вроде работает, но когда происходит очередной вызов функции из DLL, почему то данные в функции обнуляются. С чем это связано?===&lt;br /&gt;
Переменные и массивы в DLL, содержимое которых должно использоваться несколькими процессами, должны объявляться статическими. Статическая переменная или массив инициализируются только один раз в момент загрузки DLL.&lt;br /&gt;
Пример:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DWORD calltest()&lt;br /&gt;
{&lt;br /&gt;
	//будет выполнено только при первом вызове&lt;br /&gt;
	static DWORD callcount=0;&lt;br /&gt;
	static DWORD str[1000]={0}; &lt;br /&gt;
&lt;br /&gt;
	//будет выполняться каждый раз&lt;br /&gt;
	return ++callcount;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Как открыть проекцию файла в память и как с ней работать?===&lt;br /&gt;
Создаем проекцию&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HANDLE CreateFileMapping(&lt;br /&gt;
  HANDLE hFile,	//хендл уже открытого файла&lt;br /&gt;
  LPSECURITY_ATTRIBUTES lpAttributes,&lt;br /&gt;
  DWORD flProtect,	//способ открытия проекции&lt;br /&gt;
  DWORD dwMaximumSizeHigh,	//размер файла (старшие 4 байта , обычно==0)&lt;br /&gt;
  DWORD dwMaximumSizeLow,	//размер файла (младшие 4 байта)&lt;br /&gt;
  LPCTSTR lpName&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Доступ к созданной проекции производится процедурой&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LPVOID MapViewOfFile(&lt;br /&gt;
  HANDLE hFileMappingObject, //хендл проекции&lt;br /&gt;
  DWORD dwDesiredAccess,	//способ работы с проекцией&lt;br /&gt;
  DWORD dwFileOffsetHigh,&lt;br /&gt;
  DWORD dwFileOffsetLow, //смещение от начала файла (младшие 4 байта)&lt;br /&gt;
  SIZE_T dwNumberOfBytesToMap //длина в байтах (если ==0 - то весь файл)&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
далее с файлом можно работать как с обычным массивом в памяти.&lt;br /&gt;
&lt;br /&gt;
После работы с проекцией, её надо освободить процедурой&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
BOOL UnmapViewOfFile(&lt;br /&gt;
  LPCVOID lpBaseAddress //адрес, который вернула процедура MapViewOfFile&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Пример.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HANDLE hMapFile=0;//для проекции&lt;br /&gt;
&lt;br /&gt;
HANDLE hFile=...;//хендл уже открытого файла&lt;br /&gt;
DWORD dwdFileLen=...;//размер открытого файла&lt;br /&gt;
&lt;br /&gt;
//создаём проекцию &amp;quot;только для чтения&amp;quot;&lt;br /&gt;
hMapFile=::CreateFileMapping(hFile,0,PAGE_READONLY,0,dwdFileLen,0);&lt;br /&gt;
&lt;br /&gt;
//хендл hFile можно закрыть уже здесь, в принципе,&lt;br /&gt;
//но мы сделаем это позже&lt;br /&gt;
&lt;br /&gt;
//получаем доступ к проекции (тоже только для чтения)&lt;br /&gt;
BYTE* pbyFile=(BYTE*)::MapViewOfFile(hMapFile,FILE_MAP_READ,0,0,0);&lt;br /&gt;
&lt;br /&gt;
///////////////////&lt;br /&gt;
//тут работаем с массивом pbyFile[dwdFileLen] как с обычным,&lt;br /&gt;
//только не забываем, что он открыт только для чтения&lt;br /&gt;
//...&lt;br /&gt;
//...&lt;br /&gt;
//...&lt;br /&gt;
///////////////////&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//отключаем файл данных от адресного пространства&lt;br /&gt;
UnmapViewOfFile(pbyFile);&lt;br /&gt;
&lt;br /&gt;
//освобождаем хендл проекции&lt;br /&gt;
CloseHandle(hMapFile)&lt;br /&gt;
&lt;br /&gt;
//освобождаем хендл открытого файла&lt;br /&gt;
CloseHandle(hFile);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Использую MFC Grid control 2.25, не получается отобразить картинку в ячейке. Как это делается?===&lt;br /&gt;
Нужно создать список изображений (CImageList), затем передать указатель на список в контрол. Поскольку контрол лишь копирует указатель, список должен создаваться динамически, либо быть членом класса, экземпляр которого существует всё время работы контрола.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 m_GridMarket&lt;br /&gt;
CImageList m_ImageList;&lt;br /&gt;
CGridCtrL m_Grid1&lt;br /&gt;
...&lt;br /&gt;
...&lt;br /&gt;
//неким образом создаётся список&lt;br /&gt;
m_ImageList.Create(...);&lt;br /&gt;
//...&lt;br /&gt;
&lt;br /&gt;
//вставляем в контрол&lt;br /&gt;
m_Grid1.SetImageList(&amp;amp;m_ImageList);&lt;br /&gt;
&lt;br /&gt;
//&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Как при помощи IPicture отобразить картинку из файла? ===&lt;br /&gt;
Пример - несложная функция, отображающая картинку из файла&lt;br /&gt;
&lt;br /&gt;
поддерживаются форматы&lt;br /&gt;
BMP, GIF, JPEG, PNG, TIFF, EMF&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;quot;atlconv.h&amp;quot;&lt;br /&gt;
#define HandleIsValid(H) (H!=(HANDLE)-1 &amp;amp;&amp;amp; H!=(HANDLE)0)&lt;br /&gt;
&lt;br /&gt;
//*pDestDC - CDC, на который предполагается вывод картинки&lt;br /&gt;
//pchzFilePath - путь к файлу&lt;br /&gt;
//pWid - (возвращает) ширина картинки&lt;br /&gt;
//pHig - (возвращает) высота картинки&lt;br /&gt;
bool DrawBitmapFromFile(CDC* pDestDC,const char* pchzFilePath,int *pWid=0,int *pHig=0)&lt;br /&gt;
{&lt;br /&gt;
	bool result=false;&lt;br /&gt;
&lt;br /&gt;
	if(pWid)*pWid=0;&lt;br /&gt;
	if(pHig)*pHig=0;&lt;br /&gt;
&lt;br /&gt;
	int Wid=0;&lt;br /&gt;
	int Hig=0;&lt;br /&gt;
&lt;br /&gt;
	IPicture* pPic=0;&lt;br /&gt;
	try&lt;br /&gt;
	{&lt;br /&gt;
		IPicture* ptmpPic=0;&lt;br /&gt;
		USES_CONVERSION;&lt;br /&gt;
		HRESULT hr;&lt;br /&gt;
&lt;br /&gt;
		CString txt=pchzFilePath;&lt;br /&gt;
		hr= ::OleLoadPicturePath(&lt;br /&gt;
			const_cast&amp;lt;LPOLESTR&amp;gt;(T2COLE(txt)),&lt;br /&gt;
			0,0,0,IID_IPicture,&lt;br /&gt;
			reinterpret_cast&amp;lt;void **&amp;gt;(&amp;amp;ptmpPic)&lt;br /&gt;
			);&lt;br /&gt;
&lt;br /&gt;
		if(hr==S_OK &amp;amp;&amp;amp; ptmpPic)&lt;br /&gt;
		{&lt;br /&gt;
			pPic=ptmpPic;&lt;br /&gt;
		}&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			throw 0;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		OLE_XPOS_HIMETRIC cxSrc;&lt;br /&gt;
		OLE_YPOS_HIMETRIC cySrc;&lt;br /&gt;
&lt;br /&gt;
		if(S_OK!=pPic-&amp;gt;get_Width(&amp;amp;cxSrc))throw 0;&lt;br /&gt;
		if(S_OK!=pPic-&amp;gt;get_Height(&amp;amp;cySrc))throw 0;&lt;br /&gt;
&lt;br /&gt;
		Wid=cxSrc/26;&lt;br /&gt;
		Hig=cySrc/26;&lt;br /&gt;
&lt;br /&gt;
		//рисуем&lt;br /&gt;
		if(S_OK !=pPic-&amp;gt;Render(pDestDC-&amp;gt;GetSafeHdc(),&lt;br /&gt;
			0,Hig,Wid,-Hig,0,0,cxSrc,cySrc,0))throw 0;&lt;br /&gt;
	}&lt;br /&gt;
	catch(...)&lt;br /&gt;
	{&lt;br /&gt;
		result=false;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if(pPic)&lt;br /&gt;
	{&lt;br /&gt;
		pPic-&amp;gt;Release();&lt;br /&gt;
		pPic=0;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	if(pWid)*pWid=Wid;&lt;br /&gt;
	if(pHig)*pHig=Hig;&lt;br /&gt;
&lt;br /&gt;
	return result;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===У меня модальное диалоговое окно, в нем поле редактирования мультилайновое, т.е. чтобы перейти на новую строку надо нажать ентер, но вызывается стандартный обработчик диалогового окна. Подскажите, что делать?===&lt;br /&gt;
Нужно в редакторе ресурсов поставить для CEdit окошка галочку&lt;br /&gt;
свойства WantReturn,&lt;br /&gt;
&lt;br /&gt;
или добавить ES_WANTRETURN при создании CEdit контрола динамически.&lt;br /&gt;
===Как выводят картинку-логотип(splash screen) при запуске программы? То есть, когда загружается программа на экран выводится картинка, потом она исчезает(загрузка программы закончена) и пользователь может приступать к работе ===&lt;br /&gt;
Для этого используется класс, производный от CDialog. Этот диалог после создания показывает себя на экран, выводя на себя рисунок. Также запускает таймер, по срабатывани которого диалог гасится. Создаётся диалог InitInstance приложения.&lt;br /&gt;
&lt;br /&gt;
В VC6++ также есть уже готовый компонент&lt;br /&gt;
Project-&amp;gt;Add To Project -&amp;gt; Components and Controls-&amp;gt;(в папке &amp;quot;Visual C++ Components&amp;quot; есть SplashScreen.)&lt;br /&gt;
&lt;br /&gt;
===Как сделать, чтобы при выпадении списка у ComboBox была не одна строка, а больше, вроде все свойства покрутил, не помогает Вместо выпадающего списка одна строка и скролл...===&lt;br /&gt;
В редакторе ресурсов надо щелкнуть в комбобоксе на треугольнике - появляется рамка для растягивания вниз - размер выпадающего списка.&lt;br /&gt;
===В VC++.net, что делать после того, как на форму установил ActiveX ListView, как объявить класс и переменную для этого элемента?===&lt;br /&gt;
Щёлкнуть правой кнопкой мыши на элементе, в меню - add variable или add class&lt;br /&gt;
&lt;br /&gt;
===Как вставить данные в буфер обмена (Clipboard)? Как их оттуда вытащить?===&lt;br /&gt;
&lt;br /&gt;
1) копирование в буфер обмена:&lt;br /&gt;
&lt;br /&gt;
  1.Готовим данные&lt;br /&gt;
    а.Выделяем память из кучи,  вызывая GlobalAlloc()&lt;br /&gt;
    б.Получаем указатель на выделенную память, вызывая GlobalLock()&lt;br /&gt;
    в.Заполняем данные&lt;br /&gt;
    г.Освобождаем указатель, вызывая GlobalUnlock();&lt;br /&gt;
&lt;br /&gt;
  2.Открываем буфер обмена, вызывая OpenClipboard();&lt;br /&gt;
  3.Очищаем буфер, вызывая EmptyClipboard();&lt;br /&gt;
  4.Вызываем SetClipboardData() один раз для каждого формата&lt;br /&gt;
      вставляемых данных (имеется в виду - если одни и те же&lt;br /&gt;
      данные представлены в разных форматах, и приложение&lt;br /&gt;
      может эти форматы создать)&lt;br /&gt;
  5.Закрываем буфер, вызывая CloseClipboard();&lt;br /&gt;
  6.ВЫЗЫВАТЬ GlobalFree() НЕ НУЖНО, в этом случае это&lt;br /&gt;
      предоставлено системе&lt;br /&gt;
&lt;br /&gt;
Скажем, хотим поместить в буфер обмена текст.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	//готовим данные&lt;br /&gt;
	//выделяем из кучи память для данных&lt;br /&gt;
	HANDLE hglbCopy = GlobalAlloc(GMEM_MOVEABLE,10);&lt;br /&gt;
	if(!hglbCopy)return;&lt;br /&gt;
&lt;br /&gt;
	//получаем указатель&lt;br /&gt;
	void* lpStr = GlobalLock(hglbCopy);&lt;br /&gt;
	if(!lpStr)return;&lt;br /&gt;
&lt;br /&gt;
	//заполняем данные&lt;br /&gt;
	strcpy((char*)lpStr,&amp;quot;my text&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	//освобождаем указатель&lt;br /&gt;
	GlobalUnlock(hglbCopy);&lt;br /&gt;
	lpStr=0;&lt;br /&gt;
&lt;br /&gt;
	//открываем буфер обмена&lt;br /&gt;
	OpenClipboard();&lt;br /&gt;
	//очищаем&lt;br /&gt;
	EmptyClipboard();&lt;br /&gt;
&lt;br /&gt;
	//текстовый формат&lt;br /&gt;
	SetClipboardData(CF_TEXT,hglbCopy);&lt;br /&gt;
&lt;br /&gt;
	//закрываем буфер&lt;br /&gt;
	CloseClipboard();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
2) извлечение из буфера обмена&lt;br /&gt;
&lt;br /&gt;
  1.Проверяем, что поддерживается нужный формат данных,&lt;br /&gt;
      вызывая IsClipboardFormatAvailable()&lt;br /&gt;
  2.Открываем буфер обмена, вызывая OpenClipboard();&lt;br /&gt;
  3.Достаём данные&lt;br /&gt;
   а.Получаем из буфера хендл требуемого формата,&lt;br /&gt;
      вызывая GetClipboardData()&lt;br /&gt;
    б.Получаем указатель на выделенную память, вызывая GlobalLock()&lt;br /&gt;
    в.Работаем с данными&lt;br /&gt;
    г.Освобождаем указатель, вызывая GlobalUnlock();&lt;br /&gt;
  4.Закрываем буфер, вызывая CloseClipboard();&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	//Проверяем, что поддерживается нужный формат данных,&lt;br /&gt;
	if(!IsClipboardFormatAvailable(CF_TEXT))return;&lt;br /&gt;
&lt;br /&gt;
	//открываем буфер обмена&lt;br /&gt;
	OpenClipboard();&lt;br /&gt;
&lt;br /&gt;
	//достаём данные&lt;br /&gt;
&lt;br /&gt;
	//текстовый формат&lt;br /&gt;
	HANDLE hglbCopy = GetClipboardData(CF_TEXT);&lt;br /&gt;
	if(!hglbCopy)return;&lt;br /&gt;
&lt;br /&gt;
	//получаем указатель&lt;br /&gt;
	void* lpStr = GlobalLock(hglbCopy);&lt;br /&gt;
	if(!lpStr)return;&lt;br /&gt;
&lt;br /&gt;
	//читаем данные&lt;br /&gt;
	char data[10];&lt;br /&gt;
	memmove(data,lpStr,sizeof(data));&lt;br /&gt;
&lt;br /&gt;
	//освобождаем указатель&lt;br /&gt;
	GlobalUnlock(hglbCopy);&lt;br /&gt;
	lpStr=0;&lt;br /&gt;
&lt;br /&gt;
	//закрываем буфер&lt;br /&gt;
	CloseClipboard();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Как получить полный путь к экзешнику из самой программы?===&lt;br /&gt;
В командную строку первым параметром система всегда передаёт заключённый в кавычки полный путь к файлу запущенной программы. Достаём путь таким образом:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
BOOL CMyApp::InitInstance()&lt;br /&gt;
{&lt;br /&gt;
	//добыча полного имени экзешника&lt;br /&gt;
	CString csFullExeName;&lt;br /&gt;
	{&lt;br /&gt;
		CString csAppName=GetCommandLine();&lt;br /&gt;
		csAppName.Delete(0,1);&lt;br /&gt;
		csAppName.Replace('\&amp;quot;','\0');&lt;br /&gt;
		csFullExeName=(const char*)csAppName;&lt;br /&gt;
	}&lt;br /&gt;
	//теперь csFullExeName - содержит искомый путь&lt;br /&gt;
&lt;br /&gt;
	//...&lt;br /&gt;
	//...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Каким способом можно exe файл может заменить самого себя? То есть, моя программа обновляется, например, через Internet, и хочет обновить свой exe-файл. Но так как он в данный момент запущен - это будет, естественно, запрещено. Как это можно проще всего сделать?===&lt;br /&gt;
Один из способов - сделать копию экзешника и из него обновиться&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define def_exeNAMEup	&amp;quot;c:\\myprog_update.exe&amp;quot;&lt;br /&gt;
#define def_exeNAMEdnld	&amp;quot;c:\\myprog_downloaded.exe&amp;quot;&lt;br /&gt;
#define def_keyUdate	&amp;quot;/update&amp;quot;&lt;br /&gt;
&lt;br /&gt;
void CTESTFAQApp::UpdateItself()&lt;br /&gt;
{&lt;br /&gt;
	//добыча полного имени экзешника&lt;br /&gt;
	CString csFullExeName;&lt;br /&gt;
	{&lt;br /&gt;
		CString csAppName=GetCommandLine();&lt;br /&gt;
		csAppName.Delete(0,1);&lt;br /&gt;
		csAppName.Replace('\&amp;quot;','\0');&lt;br /&gt;
		csFullExeName=(const char*)csAppName;&lt;br /&gt;
	}&lt;br /&gt;
	//теперь csFullExeName - содержит искомый путь&lt;br /&gt;
&lt;br /&gt;
	//делаем копию экзешника с другим именем&lt;br /&gt;
	CopyFile(csFullExeName,def_exeNAMEup,0);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	//передаём в параметры нового процесса ключ и путь к текущему файлу&lt;br /&gt;
	CString csParams=def_keyUdate;&lt;br /&gt;
	csParams+=&amp;quot; &amp;quot;;&lt;br /&gt;
	csParams+=csFullExeName;&lt;br /&gt;
&lt;br /&gt;
	//запускаем копию&lt;br /&gt;
	STARTUPINFO si;&lt;br /&gt;
	PROCESS_INFORMATION pi;&lt;br /&gt;
	ZeroMemory(&amp;amp;si,sizeof(si));&lt;br /&gt;
	si.cb = sizeof(si);&lt;br /&gt;
	ZeroMemory(&amp;amp;pi,sizeof(pi));&lt;br /&gt;
	if(CreateProcess(def_exeNAMEup,def_keyUdate,0,0,0,0,0,0,&amp;amp;si,&amp;amp;pi))&lt;br /&gt;
	{&lt;br /&gt;
		//завершаем текущий процесс&lt;br /&gt;
		ExitFromMyApp();&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void CTESTFAQApp::ExitFromMyApp()&lt;br /&gt;
{&lt;br /&gt;
	exit(0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
BOOL CTESTFAQApp::InitInstance()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
	//смотрим, не запустили ли для апдейта?&lt;br /&gt;
&lt;br /&gt;
	CString txt;&lt;br /&gt;
	txt=m_lpCmdLine;&lt;br /&gt;
	if(txt.Find(def_keyUdate)==0)&lt;br /&gt;
	{&lt;br /&gt;
		//делаем айдейт&lt;br /&gt;
		txt.Replace(def_keyUdate,&amp;quot;&amp;quot;);&lt;br /&gt;
		txt.TrimLeft();&lt;br /&gt;
&lt;br /&gt;
		CString csFullExeName=txt;&lt;br /&gt;
&lt;br /&gt;
		//берём откуда то уже скачанный файл обновления&lt;br /&gt;
		//...&lt;br /&gt;
		CString csFull_Downloaded_ExeName=def_exeNAMEdnld;&lt;br /&gt;
&lt;br /&gt;
		//копируем файл (обновляем старый то есть)&lt;br /&gt;
		CopyFile(csFull_Downloaded_ExeName,csFullExeName,0);&lt;br /&gt;
&lt;br /&gt;
		//запускаем обновлённого мученника&lt;br /&gt;
		STARTUPINFO si;&lt;br /&gt;
		PROCESS_INFORMATION pi;&lt;br /&gt;
		ZeroMemory(&amp;amp;si,sizeof(si));&lt;br /&gt;
		si.cb = sizeof(si);&lt;br /&gt;
		ZeroMemory(&amp;amp;pi,sizeof(pi));&lt;br /&gt;
		if(CreateProcess(csFullExeName,0,0,0,0,0,0,0,&amp;amp;si,&amp;amp;pi))&lt;br /&gt;
&lt;br /&gt;
		ExitFromMyApp();&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
	//...&lt;br /&gt;
	//...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Есть строка символов (страничка из Инета) в кодировке utf-8 (строка char*). Как мне ее получить в формате String&lt;br /&gt;
или в char* в кодировке ANSI (cp 1251) ?===&lt;br /&gt;
Можно перевести строку из UTF8 в Unicode, затем из Unicode в 1251&lt;br /&gt;
&lt;br /&gt;
Ниже приведена структура, содержащая процедуры перекодирования,&lt;br /&gt;
а также процедуру с примером использования&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//описание структуры&lt;br /&gt;
struct coder&lt;br /&gt;
{&lt;br /&gt;
	//utf8-&amp;gt;unicode&lt;br /&gt;
	static wchar_t* utf8_to_unicode__dontForgetDeleteArr(const char *utf8_string)&lt;br /&gt;
	{&lt;br /&gt;
		wchar_t* pRes=0;&lt;br /&gt;
		int res_len=0;&lt;br /&gt;
&lt;br /&gt;
		//тест на возможность преобразования&lt;br /&gt;
		res_len=MultiByteToWideChar(CP_UTF8,0,utf8_string,-1,0,0);&lt;br /&gt;
		if(!res_len)return 0;&lt;br /&gt;
&lt;br /&gt;
		//выделяем память&lt;br /&gt;
		pRes = new wchar_t[res_len];&lt;br /&gt;
		if(!pRes)return 0;&lt;br /&gt;
&lt;br /&gt;
		//преобразование&lt;br /&gt;
		if(!MultiByteToWideChar(CP_UTF8,0,utf8_string,-1,pRes,res_len))&lt;br /&gt;
		{&lt;br /&gt;
			delete [] pRes;&lt;br /&gt;
			return 0;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		return pRes;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	//unicode-&amp;gt;1251&lt;br /&gt;
	static char * unicode_to_1251__dontForgetDeleteArr(const wchar_t *unicode_string)&lt;br /&gt;
	{&lt;br /&gt;
		char* pRes=0;&lt;br /&gt;
		int res_len=0;&lt;br /&gt;
&lt;br /&gt;
		//тест на возможность преобразования&lt;br /&gt;
		res_len = WideCharToMultiByte(1251,0,unicode_string,-1,0,0,0,0);&lt;br /&gt;
		if(!res_len)return 0;&lt;br /&gt;
&lt;br /&gt;
		//выделяем память&lt;br /&gt;
		pRes=new char[res_len];&lt;br /&gt;
		if(!pRes)return 0;&lt;br /&gt;
&lt;br /&gt;
		//преобразование&lt;br /&gt;
		if(!WideCharToMultiByte(1251,0,unicode_string,-1,pRes,res_len,0,0))&lt;br /&gt;
		{&lt;br /&gt;
			delete [] pRes;&lt;br /&gt;
			return 0;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		return pRes;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	//процедура с примером&lt;br /&gt;
	static void Example()&lt;br /&gt;
	{&lt;br /&gt;
		wchar_t* unicode_string=0;&lt;br /&gt;
		char* cp1251_string=0;&lt;br /&gt;
&lt;br /&gt;
		//исходный текст&lt;br /&gt;
		char utf8_string[] = &amp;quot;UTF-8 + СЂСѓСЃСЃРєРёР№ С‚РµРєСЃС‚&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
		for(;;)&lt;br /&gt;
		{&lt;br /&gt;
&lt;br /&gt;
			unicode_string=utf8_to_unicode__dontForgetDeleteArr(utf8_string);&lt;br /&gt;
			if(!unicode_string)&lt;br /&gt;
			{&lt;br /&gt;
				AfxMessageBox(&amp;quot;Не удалось конвертировать в unicode!&amp;quot;);&lt;br /&gt;
				break;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			cp1251_string = unicode_to_1251__dontForgetDeleteArr(unicode_string);&lt;br /&gt;
&lt;br /&gt;
			if(!cp1251_string)&lt;br /&gt;
			{&lt;br /&gt;
				AfxMessageBox(&amp;quot;Не удалось конвертировать из unicode!&amp;quot;);&lt;br /&gt;
				break;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			break;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		//cp1251_string - результат&lt;br /&gt;
		AfxMessageBox(cp1251_string);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
		//не забываем удалить массивы&lt;br /&gt;
		if(unicode_string)&lt;br /&gt;
		{&lt;br /&gt;
			delete [] unicode_string;&lt;br /&gt;
			unicode_string=0;&lt;br /&gt;
		}&lt;br /&gt;
		if(cp1251_string)&lt;br /&gt;
		{&lt;br /&gt;
			delete [] cp1251_string;&lt;br /&gt;
			cp1251_string=0;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
//вызов примера&lt;br /&gt;
coder::Example();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как организовать взаимодействие программы на VC.net с Access-овской базой данных?===&lt;br /&gt;
Проще всего подключить ADO компоненты и сделать все на них.&lt;br /&gt;
Компоненты  ADO (ADODC,DATAGRID и т.п.) это ActiveX.&lt;br /&gt;
В редакторе ресурсов, во всплывающем меню, есть Insert ActiveX Control -&amp;gt; открывается список всех компоент,&lt;br /&gt;
зарегистрированых на машине. Нужно найти компоненты (Это компоненты от MS и они помечены (OLEDB)) и вставить их в диалог. Для того что бы иметь возможность управлять ими, нужно импортировать обертки для них, это делается при помощи ClassWisard, там есть импорт-&amp;gt;класс-&amp;gt;указать файл с компоентой (OSX).&lt;br /&gt;
Появляется список всех классов, объявленых внутри.&lt;br /&gt;
Проставляем галочки, нажимаем ОК.&lt;br /&gt;
&lt;br /&gt;
[[Category:FAQ]]&lt;/div&gt;</summary>
		<author><name>Mczim</name></author>	</entry>

	<entry>
		<id>https://wiki.shelek.ru/index.php?title=FAQ:WinAPI,_VCPP_Part_3&amp;diff=422</id>
		<title>FAQ:WinAPI, VCPP Part 3</title>
		<link rel="alternate" type="text/html" href="https://wiki.shelek.ru/index.php?title=FAQ:WinAPI,_VCPP_Part_3&amp;diff=422"/>
				<updated>2008-08-14T19:05:05Z</updated>
		
		<summary type="html">&lt;p&gt;Mczim: пробел перед знаком вопроса в заголовке + пробел перед запятыми по тексту + в буфер обмена туда текст &amp;gt; в буфер обмена текст&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Имеется приложение на основе CRichEditView. Как узнать, что пользователь меняет текст?===&lt;br /&gt;
Добавить обработчик сообщения EN_CHANGE. Сообщение генерируется CRichEditView каждый раз, когда пользователь изменяет текст в окне CRichEditView&lt;br /&gt;
===Чем метод CArray::GetSize отличается от метода CArray::GetCount?===&lt;br /&gt;
Абсолютно ничем. (Скорее всего, были предыдущие библиотеки, в которых функции, одинаковые по смыслу, имели разные имена. Поэтому в целях совместимости оставили оба)&lt;br /&gt;
===Как загрузить строку из ресурса?===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CString m_Temp;&lt;br /&gt;
m_Temp.LoadString(ID_MYSTRING);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как поменять иконку у элемента (item) в CListCtrl?===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//заполняем структуру LVITEM&lt;br /&gt;
LVITEM lvItem;&lt;br /&gt;
memset(&amp;amp;lvItem,0,sizeof(lvItem));&lt;br /&gt;
	&lt;br /&gt;
lvItem.mask = LVIF_IMAGE;//меняться будет картинка&lt;br /&gt;
lvItem.iItem = ...;// индекс элемента списка (Zero-based)&lt;br /&gt;
lvItem.iSubItem = 0;&lt;br /&gt;
lvItem.iImage = ...; //индекс иконки (из списка контрола)&lt;br /&gt;
	&lt;br /&gt;
pList-&amp;gt;SetItem(&amp;amp; lvItem);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Имеется класс Class1, содержащий мембер типа указатель на Class2. В Class2 также имеется указатель на Class1. Компилятор выдаёт ошибку. Что надо делать?===&lt;br /&gt;
Предварительно объявляем класс Class2. Тогда компилятору будет известно, что описание класса Class2 будет встречено дальше, и станет возможным объявление указателей на класс до описания самого класса.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Class2;//предопределение&lt;br /&gt;
	&lt;br /&gt;
Class1&lt;br /&gt;
{&lt;br /&gt;
	Class2* p;&lt;br /&gt;
};&lt;br /&gt;
	&lt;br /&gt;
Class2&lt;br /&gt;
{&lt;br /&gt;
	Class1* p;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как переключить раскладку в другом (то есть в активном) процессе?===&lt;br /&gt;
Использовать функции:&lt;br /&gt;
   GetKeyboardLayout - определить текущую раскладку&lt;br /&gt;
   LoadKeyboardLayout - загрузить новую раскладку&lt;br /&gt;
&lt;br /&gt;
см.также&lt;br /&gt;
   VerLanguageName - получить строку с описанием языка&lt;br /&gt;
&lt;br /&gt;
(подробности - в MSDN)&lt;br /&gt;
===Как получить хендл контрола Edit зная его ID?===&lt;br /&gt;
Пусть контрол лежит на окне CMyWnd&lt;br /&gt;
Тогда:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void CMyWnd::некая_процедура()&lt;br /&gt;
{&lt;br /&gt;
	//для MFC&lt;br /&gt;
	CEdit* ed=(CEdit* ) GetDlgItem(ID_EDIT1);&lt;br /&gt;
	HWND hwnd=ed-&amp;gt;GetSafeHwnd();&lt;br /&gt;
	...&lt;br /&gt;
	&lt;br /&gt;
	//для Win32 API&lt;br /&gt;
	HWND hwnd=GetDlgItem(m_hWnd,ID_EDIT1);&lt;br /&gt;
	...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Как из дочернего окна закрыть приложение?===&lt;br /&gt;
Нужно послать родительскому окну (*pParent) сообщение WM_CLOSE:&lt;br /&gt;
 pParent-&amp;gt;PostMessage(WM_CLOSE);//MFC&lt;br /&gt;
или&lt;br /&gt;
 ::PostMessage(pParent-&amp;gt;m_hWnd,WM_CLOSE,(WPARAM)0,(LPARAM)0);//API&lt;br /&gt;
===Как корректно перевести BSTR в CString и наоборот?===&lt;br /&gt;
Нужно просто присвоить переменной типа CString переменную типа BSTR.&lt;br /&gt;
Оператор = класса CString сам всё переведёт.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//указатель на будущий буфер с BSTR.&lt;br /&gt;
//	(По сути, BSTR определён как &lt;br /&gt;
//	typedef WCHAR* BSTR;&lt;br /&gt;
//	то есть указатель на 16-битный символ юникод)&lt;br /&gt;
	&lt;br /&gt;
BSTR bstrHE=0;&lt;br /&gt;
	&lt;br /&gt;
CString Str=&amp;quot;мой текст&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
//Выделить память и загрузить адрес блока в bstrHE&lt;br /&gt;
bstrHE=Str.AllocSysString();&lt;br /&gt;
	&lt;br /&gt;
//...	&lt;br /&gt;
//тут работаем с bstrHE[]&lt;br /&gt;
//...&lt;br /&gt;
	&lt;br /&gt;
//освобождаем память&lt;br /&gt;
SysFreeString(bstrHE);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Как получить доступ к графическим ресурсам элементов текущей темы оформления Windows?===&lt;br /&gt;
Использовать функции&lt;br /&gt;
&lt;br /&gt;
OpenThemeData()&lt;br /&gt;
DrawThemeBackground()&lt;br /&gt;
DrawFrameControl()&lt;br /&gt;
CloseThemeData().&lt;br /&gt;
&lt;br /&gt;
(подробности - в MSDN)&lt;br /&gt;
===Имеется класс , производный от CDialog. Когда диалог в фокусе, нажатие на Enter или Esc приводит к закрытию диалога. Как это запретить?===&lt;br /&gt;
При нажатии Enter происходит выполнение команды IDOK,&lt;br /&gt;
при нажатии Esc - IDCANCEL.&lt;br /&gt;
Нужно переопределить в классе виртуальные функции OnOk() и OnCancel(),&lt;br /&gt;
которые соответственно вызываются для этих команд. При помощи&lt;br /&gt;
визарда эти функции добавить можно так: Положить на диалог две кнопки&lt;br /&gt;
с идентификаторами IDOK и IDCANCEL (при создании нового диалога они там&lt;br /&gt;
есть сразу), затем двойной клик по кнопке добавляет соответствующий&lt;br /&gt;
обработчик. В обработчиках надо удалить вызовы СDialog::OnOK() и&lt;br /&gt;
CDialog::OnCancel(), тогда диалог закрываться не будет.&lt;br /&gt;
Однако тогда диалог станет невозможно закрыть кнопкой с крестиком  :)&lt;br /&gt;
&lt;br /&gt;
Лечить так: добавить обработчик сообщения WM_CLOSE - OnClose(), и в нём&lt;br /&gt;
сделать вызов OnOk() или OnCancel() :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void CPlayersPropsDialog::OnClose() &lt;br /&gt;
{&lt;br /&gt;
	CDialog::OnClose();&lt;br /&gt;
	CDialog::OnCancel();//добавлено&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===VC++6. Я написал простейший макрос, а компилятор на него ругается. Ума не приложу, что за глюк?===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	#define my_macr(x,y,z) \&lt;br /&gt;
		z=\&lt;br /&gt;
		(x+y)*\&lt;br /&gt;
		(x-y)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Скорее всего после одного из символов соединения строк &amp;quot;\&amp;quot; имеется&lt;br /&gt;
пробел или табуляция. Их надо удалить. Можно найти их &amp;quot;наощупь&amp;quot;, а&lt;br /&gt;
можно включить показ непечатных символов в студии. Найти эту команду&lt;br /&gt;
можно так:&lt;br /&gt;
Tools-&amp;gt;Customize...-&amp;gt;вкладка Commands. В окошке Category выбрать&lt;br /&gt;
&amp;quot;Edit&amp;quot;, и среди кнопок справа найти кнопку, на которой написано &amp;quot;a.b&amp;quot;&lt;br /&gt;
Эту кнопку надо перетащить на одну из панелей инструментов студии.&lt;br /&gt;
&lt;br /&gt;
===Как получить список всех процесов, включая idle?===&lt;br /&gt;
Использовать функции&lt;br /&gt;
Process32First()&lt;br /&gt;
Precess32Next()&lt;br /&gt;
&lt;br /&gt;
===Как программно установить переменные окружения?===&lt;br /&gt;
Чтобы добавить или изменить их программно, необходимо воспользоваться&lt;br /&gt;
ключом реестра HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\&lt;br /&gt;
Session Manager\Environment, а затем отправить широковещательное&lt;br /&gt;
сообщение WM_SETTINGCHANGE. Это позволит приложениям узнать об&lt;br /&gt;
изменениях:&lt;br /&gt;
&lt;br /&gt;
::SendMessage(HWND_BROADCAST,WM_SETTINGCHANGE,0,0);&lt;br /&gt;
===Как сделать, чтобы у окна был черный фон?===&lt;br /&gt;
переопределить обработчик сообщения WM_CTLCOLOR - OnCtlColor() :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CBrush br(RGB(0,0,0));&lt;br /&gt;
	&lt;br /&gt;
HBRUSH CMyDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) &lt;br /&gt;
{&lt;br /&gt;
	HBRUSH hbr = CMyDlg::OnCtlColor(pDC, pWnd, nCtlColor);&lt;br /&gt;
	&lt;br /&gt;
	//фон диалога (или вьюшки)&lt;br /&gt;
	if(nCtlColor==CTLCOLOR_DLG)&lt;br /&gt;
	{&lt;br /&gt;
		return (HBRUSH)br;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	//фон статиков (если нужно)&lt;br /&gt;
	if(nCtlColor==CTLCOLOR_STATIC)&lt;br /&gt;
	{&lt;br /&gt;
		//делаем фон текста статика прозрачным&lt;br /&gt;
		pDC-&amp;gt;SetBkMode(TRANSPARENT);&lt;br /&gt;
		return (HBRUSH)br;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	return hbr;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Почему на моем компьютере экзешник, созданный в MFC запускается, а на других компьютерах - нет? Требует какую-то  dll-ку.===&lt;br /&gt;
Нужно выбирать режим Release :&lt;br /&gt;
&lt;br /&gt;
Menu-&amp;gt;Build-&amp;gt;Configurations...-&amp;gt;Release,&lt;br /&gt;
&lt;br /&gt;
и экзешник, соответственно, брать из папки Release проекта&lt;br /&gt;
===Как в диалог добавить меню?===&lt;br /&gt;
Надо сделать в ресурсах меню, затем вставить в диалог:&lt;br /&gt;
&lt;br /&gt;
открыть в редакторе диалог, в свойствах (во вкладке General, окошко Menu) указать идентивикатор ресурса меню.&lt;br /&gt;
При помощи визарда добавить для меню обработчики OnCommand() и OnUpdateСommand().&lt;br /&gt;
===Я добавил визардом меню в диалог. Добавил обработчики для пунктов меню. Пункты работают, но OnUpdate для пунктов не вызывается - то есть не получается ни затенить, ни чек поставить. Что делать?===&lt;br /&gt;
В диалоге у меню апдейта не происходит сам, в отличие от мейнфрейма.&lt;br /&gt;
Для этого нужно сделать самим апдейт в обработчике сообщения WM_KICKIDLE.&lt;br /&gt;
Визардом обработчик не добавляется, поэтому можно переопределить виртуальную DefWindowProc() и там обработать:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;afxpriv.h&amp;gt;	//этот файл надо включить, там определёна WM_KICKIDLE&lt;br /&gt;
&lt;br /&gt;
LRESULT CMyDialog::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam) &lt;br /&gt;
{&lt;br /&gt;
	if(message==WM_KICKIDLE)&lt;br /&gt;
	{&lt;br /&gt;
		//делаем апдейт для всех пунктов меню&lt;br /&gt;
		CMenu* pMainMenu=GetMenu();&lt;br /&gt;
		if(pMainMenu)&lt;br /&gt;
		{&lt;br /&gt;
			CCmdUI cmdUI;&lt;br /&gt;
			for (UINT n=0; n &amp;lt; pMainMenu-&amp;gt;GetMenuItemCount(); ++n)&lt;br /&gt;
			{&lt;br /&gt;
				CMenu* pSubMenu = pMainMenu-&amp;gt;GetSubMenu(n);&lt;br /&gt;
				if(!pSubMenu)continue;&lt;br /&gt;
	&lt;br /&gt;
				cmdUI.m_nIndexMax = pSubMenu-&amp;gt;GetMenuItemCount();&lt;br /&gt;
				for (UINT i = 0; i &amp;lt; cmdUI.m_nIndexMax;++i)&lt;br /&gt;
				{&lt;br /&gt;
					cmdUI.m_nIndex = i;&lt;br /&gt;
					cmdUI.m_nID = pSubMenu-&amp;gt;GetMenuItemID(i);&lt;br /&gt;
					cmdUI.m_pMenu = pSubMenu;&lt;br /&gt;
					cmdUI.DoUpdate(this, FALSE);&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	return CDialog::DefWindowProc(message, wParam, lParam);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Как на Visual C++ 6.0 в Главном окне отключить системное меню (в левом верхнем углу) и кнопки(в правом верхнем углу)?===&lt;br /&gt;
При создании окна нужно убрать стиль WS_SYSMENU&lt;br /&gt;
(теперь пользователь корректно может закрыть окно только Alt+F4,&lt;br /&gt;
ну или если вы предоставите ему дополнительную возможность сделать это)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пример 1. (для SDI, MDI)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//этот обработчик уже добавлен визардом&lt;br /&gt;
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT&amp;amp; cs)&lt;br /&gt;
{&lt;br /&gt;
	if( !CFrameWnd::PreCreateWindow(cs) )&lt;br /&gt;
		return FALSE;&lt;br /&gt;
	// TODO: Modify the Window class or styles here by modifying&lt;br /&gt;
	//  the CREATESTRUCT cs&lt;br /&gt;
&lt;br /&gt;
	///////////////////////////////&lt;br /&gt;
	//добавленная часть&lt;br /&gt;
	{&lt;br /&gt;
		//убираем стиль&lt;br /&gt;
		cs.style&amp;amp;=~WS_SYSMENU;&lt;br /&gt;
	}&lt;br /&gt;
	///////////////////////////////&lt;br /&gt;
&lt;br /&gt;
	return TRUE;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Пример 2. (для диалога)&lt;br /&gt;
Если диалог описан в ресурсах, то в свойствах диалога убрать галочки&lt;br /&gt;
  &amp;quot;System menu&amp;quot;&lt;br /&gt;
  &amp;quot;Minimize box&amp;quot;&lt;br /&gt;
  &amp;quot;Maximize box&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===Хочу сделать так, чтобы пользователь не мог нажать на кнопку, пока программа не разрешит.===&lt;br /&gt;
Нужно применить метод класса CWnd::EnableWindow(...) для кнопки.&lt;br /&gt;
Значение параметра 0 делает кнопку неактивной, 1 - делает активной.&lt;br /&gt;
(кстате, не только для кнопки можно, а для любого класса, производного&lt;br /&gt;
от класса CWnd)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пусть имеется некий диалог, на нём лежит кнопка c ID == IDC_1.&lt;br /&gt;
в любом месте кода диалога (кроме конструктора и деструктора , хотя, если&lt;br /&gt;
проверить наличие валидного хендла диалога, как в примере, то ничего&lt;br /&gt;
страшного не будет и там)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//делаем кнопку неактивной&lt;br /&gt;
if(m_hWnd)&lt;br /&gt;
{&lt;br /&gt;
	CWnd* pw=0;&lt;br /&gt;
	pw=GetDlgItem(IDC_1);&lt;br /&gt;
	if(pw)pw-&amp;gt;EnableWindow(0);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Что означают сообщения, которые студия выводит при компиляции, вроде таких : Loaded 'C:\WINDOWS\SYSTEM\WSOCK32.DLL', no matching symbolic information found. ===&lt;br /&gt;
Это строка говорит о том, что студия не смогла найти отладочные&lt;br /&gt;
символы для WSOCK32.DLL. В этом нет ничего страшного, просто при наличии&lt;br /&gt;
отладочных символов в процессе отладки можно получить доступ к именам&lt;br /&gt;
функции из системных DLL. Например, вместо&lt;br /&gt;
 KERNEL32! 0x77E8B184() -&lt;br /&gt;
 увидим&lt;br /&gt;
 KERNEL32!CreateThread.&lt;br /&gt;
===Как обработать сообщения, которое приходит к некому контролу (скажем CEdit)?===&lt;br /&gt;
Нужно произвести от CEdit свой класс, и в виртуальной процедуре класса WindowProc перехватить нужные сообщения.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
virtual LRESULT WindowProc(&lt;br /&gt;
   UINT message,&lt;br /&gt;
   WPARAM wParam,&lt;br /&gt;
   LPARAM lParam &lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Пример. Полностью выключаем, скажем, обработку сообщения WM_CHAR&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	LRESULT CMyEdit::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) &lt;br /&gt;
	{&lt;br /&gt;
		switch(message)&lt;br /&gt;
		{&lt;br /&gt;
			case WM_CHAR:&lt;br /&gt;
			{&lt;br /&gt;
				return 0;&lt;br /&gt;
			}&lt;br /&gt;
			break;&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		return CEdit::WindowProc(message, wParam, lParam);&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Чтобы связать экземпляр класса с контролом на форме, добавьте визардом для&lt;br /&gt;
контрола переменную класса (выбрав не Value а Control).&lt;br /&gt;
&lt;br /&gt;
===Как настроить количество пробелов в табуляции?===&lt;br /&gt;
Tools-&amp;gt;Options-&amp;gt;Tabs-&amp;gt;Insert Spaces&lt;br /&gt;
(или  правой кнопкой мыши по тексту-&amp;gt; properties)&lt;br /&gt;
===Как автоматически расставить отступы?===&lt;br /&gt;
Выделить текст для форматирования, нажать Alt+F8&lt;br /&gt;
&lt;br /&gt;
Есть ещё программа Artistic Style, которая занимается&lt;br /&gt;
переформатированием кода&lt;br /&gt;
http://sourceforge.net/projects/astyle/&lt;br /&gt;
===Поиск границ блока===&lt;br /&gt;
&amp;quot;CTRL+ }&amp;quot; ищет парную фигурную скобку в тексте и переходит на неё&lt;br /&gt;
===Вертикальное выделение текста===&lt;br /&gt;
&amp;quot;Alt + выделение мышкой&amp;quot; - позволяет выделять вертикальные фрагменты текста&lt;br /&gt;
===Как узнать количество установленных в CListCtrl столбцов?===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CListCtrl* pL=...; //указатель на переменную-контрол&lt;br /&gt;
&lt;br /&gt;
int count=pL-&amp;gt;GetHeaderCtrl()-&amp;gt;GetItemCount();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Как получить иконку приложения?===&lt;br /&gt;
Если приложение запущено, то нужно найти его главное окно и&lt;br /&gt;
послать ему сообщение WM_GETICON.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//функция возвращант хендл иконки &lt;br /&gt;
LRESULT SendMessage(hWnd, WM_GETICON, wParam, 0);&lt;br /&gt;
&lt;br /&gt;
//hWnd == хендл окна приложения&lt;br /&gt;
//wParam == &lt;br /&gt;
//	1)==ICON_BIG - получить большую иконку&lt;br /&gt;
//	2)==ICON_SMALL - получить маленькую иконку&lt;br /&gt;
//	3)==ICON_SMALL2 - получить маленькую иконку, если она определена&lt;br /&gt;
//				в приложении. Если её нет, то маленькую иконку, &lt;br /&gt;
//				сгенерированную системой из большой иконки&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как в CString можно найти или вырезать часть строки?===&lt;br /&gt;
есть такие методы в CString:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//вырезает кусок строки&lt;br /&gt;
CString Mid(int nFirst) const;&lt;br /&gt;
CString Mid(int nFirst,  int nCount) const;&lt;br /&gt;
&lt;br /&gt;
//возвращает кусок строки (сначала или с конца)&lt;br /&gt;
CString Left(int nCount ) const;&lt;br /&gt;
CString Right(int nCount ) const;&lt;br /&gt;
&lt;br /&gt;
//возвращает начальный кусок строки, в котором есть только&lt;br /&gt;
//символы из набора,представленного в lpszCharSet&lt;br /&gt;
CString SpanIncluding(LPCTSTR lpszCharSet ) const;&lt;br /&gt;
&lt;br /&gt;
//возвращает начальный кусок строки, в котором нет&lt;br /&gt;
//символов из набора,представленного в lpszCharSet&lt;br /&gt;
CString SpanExcluding(LPCTSTR lpszCharSet ) const; &lt;br /&gt;
&lt;br /&gt;
//убирает &amp;quot;пробелоподобные&amp;quot; символы из самого начала строки&lt;br /&gt;
//(то есть - пробел, табуляцию (\t) , возврат каретки, перевод строки (/r/n))&lt;br /&gt;
void TrimLeft();&lt;br /&gt;
//убирает все повторы символа из самого начала строки&lt;br /&gt;
void TrimLeft(TCHAR chTarget );&lt;br /&gt;
//убирает из самого начала строки все символа из набора lpszTargets &lt;br /&gt;
void TrimLeft(LPCTSTR lpszTargets ); &lt;br /&gt;
&lt;br /&gt;
void TrimRight();&lt;br /&gt;
void TrimRight(TCHAR chTarget );&lt;br /&gt;
void TrimRight(LPCTSTR lpszTargets ); &lt;br /&gt;
&lt;br /&gt;
//поиск в строке&lt;br /&gt;
int Find( TCHAR ch ) const;&lt;br /&gt;
int Find( LPCTSTR lpszSub ) const;&lt;br /&gt;
int Find( TCHAR ch, int nStart ) const;&lt;br /&gt;
int Find( LPCTSTR pstr, int nStart ) const;&lt;br /&gt;
&lt;br /&gt;
//поиск, начиная с конца&lt;br /&gt;
int ReverseFind( TCHAR ch ) const;&lt;br /&gt;
&lt;br /&gt;
//поиск позиции первого символа, одного из набора,&lt;br /&gt;
// представленного в lpszCharSet&lt;br /&gt;
int FindOneOf( LPCTSTR lpszCharSet ) const;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Есть у меня CListBox и я в ходе выполнения программы добавляю в него строки. Но я не могу посмотреть что именно добавляется. Вывод результатов происходит в конце выполнения процедуры...===&lt;br /&gt;
Если нужно делать принудительную перерисовку окна во время&lt;br /&gt;
длительных вычислений, то нужно вызывать для окна, которое&lt;br /&gt;
надо перерисовать метод&lt;br /&gt;
  RedrawWindow()&lt;br /&gt;
с параметрами по умолчанию, или пару&lt;br /&gt;
  Invalidate(0);&lt;br /&gt;
  UpdateWindow();&lt;br /&gt;
Это приводит к пометке всего окна к перерисовке и отправлению&lt;br /&gt;
сообщения WM_PAINT в оконную процедуру в обход очереди&lt;br /&gt;
сообщений, вызывая немедленную перерисовку окна.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CWnd* pw=...;//окно, которое надо перерисовывать&lt;br /&gt;
&lt;br /&gt;
for(int i=0;i&amp;lt;10000)&lt;br /&gt;
{&lt;br /&gt;
	//меняется содержимое окна&lt;br /&gt;
	//...&lt;br /&gt;
&lt;br /&gt;
	//немедленная перерисовка&lt;br /&gt;
	pw-&amp;gt;Invalidate(0);&lt;br /&gt;
	pw-&amp;gt;UpdateWindow();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Я написал DLL, которую используют несколько приложений. Всё вроде работает, но когда происходит очередной вызов функции из DLL, почему то данные в функции обнуляются. С чем это связано?===&lt;br /&gt;
Переменные и массивы в DLL, содержимое которых должно использоваться несколькими процессами, должны объявляться статическими. Статическая переменная или массив инициализируются только один раз в момент загрузки DLL.&lt;br /&gt;
Пример:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DWORD calltest()&lt;br /&gt;
{&lt;br /&gt;
	//будет выполнено только при первом вызове&lt;br /&gt;
	static DWORD callcount=0;&lt;br /&gt;
	static DWORD str[1000]={0}; &lt;br /&gt;
&lt;br /&gt;
	//будет выполняться каждый раз&lt;br /&gt;
	return ++callcount;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Как открыть проекцию файла в память и как с ней работать?===&lt;br /&gt;
Создаем проекцию&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HANDLE CreateFileMapping(&lt;br /&gt;
  HANDLE hFile,	//хендл уже открытого файла&lt;br /&gt;
  LPSECURITY_ATTRIBUTES lpAttributes,&lt;br /&gt;
  DWORD flProtect,	//способ открытия проекции&lt;br /&gt;
  DWORD dwMaximumSizeHigh,	//размер файла (старшие 4 байта , обычно==0)&lt;br /&gt;
  DWORD dwMaximumSizeLow,	//размер файла (младшие 4 байта)&lt;br /&gt;
  LPCTSTR lpName&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Доступ к созданной проекции производится процедурой&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LPVOID MapViewOfFile(&lt;br /&gt;
  HANDLE hFileMappingObject, //хендл проекции&lt;br /&gt;
  DWORD dwDesiredAccess,	//способ работы с проекцией&lt;br /&gt;
  DWORD dwFileOffsetHigh,&lt;br /&gt;
  DWORD dwFileOffsetLow, //смещение от начала файла (младшие 4 байта)&lt;br /&gt;
  SIZE_T dwNumberOfBytesToMap //длина в байтах (если ==0 - то весь файл)&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
далее с файлом можно работать как с обычным массивом в памяти.&lt;br /&gt;
&lt;br /&gt;
После работы с проекцией, её надо освободить процедурой&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
BOOL UnmapViewOfFile(&lt;br /&gt;
  LPCVOID lpBaseAddress //адрес, который вернула процедура MapViewOfFile&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Пример.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HANDLE hMapFile=0;//для проекции&lt;br /&gt;
&lt;br /&gt;
HANDLE hFile=...;//хендл уже открытого файла&lt;br /&gt;
DWORD dwdFileLen=...;//размер открытого файла&lt;br /&gt;
&lt;br /&gt;
//создаём проекцию &amp;quot;только для чтения&amp;quot;&lt;br /&gt;
hMapFile=::CreateFileMapping(hFile,0,PAGE_READONLY,0,dwdFileLen,0);&lt;br /&gt;
&lt;br /&gt;
//хендл hFile можно закрыть уже здесь, в принципе,&lt;br /&gt;
//но мы сделаем это позже&lt;br /&gt;
&lt;br /&gt;
//получаем доступ к проекции (тоже только для чтения)&lt;br /&gt;
BYTE* pbyFile=(BYTE*)::MapViewOfFile(hMapFile,FILE_MAP_READ,0,0,0);&lt;br /&gt;
&lt;br /&gt;
///////////////////&lt;br /&gt;
//тут работаем с массивом pbyFile[dwdFileLen] как с обычным,&lt;br /&gt;
//только не забываем, что он открыт только для чтения&lt;br /&gt;
//...&lt;br /&gt;
//...&lt;br /&gt;
//...&lt;br /&gt;
///////////////////&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//отключаем файл данных от адресного пространства&lt;br /&gt;
UnmapViewOfFile(pbyFile);&lt;br /&gt;
&lt;br /&gt;
//освобождаем хендл проекции&lt;br /&gt;
CloseHandle(hMapFile)&lt;br /&gt;
&lt;br /&gt;
//освобождаем хендл открытого файла&lt;br /&gt;
CloseHandle(hFile);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Использую MFC Grid control 2.25, не получается отобразить картинку в ячейке. Как это делается?===&lt;br /&gt;
Нужно создать список изображений (CImageList), затем передать указатель на список в контрол. Поскольку контрол лишь копирует указатель, список должен создаваться динамически, либо быть членом класса, экземпляр которого существует всё время работы контрола.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 m_GridMarket&lt;br /&gt;
CImageList m_ImageList;&lt;br /&gt;
CGridCtrL m_Grid1&lt;br /&gt;
...&lt;br /&gt;
...&lt;br /&gt;
//неким образом создаётся список&lt;br /&gt;
m_ImageList.Create(...);&lt;br /&gt;
//...&lt;br /&gt;
&lt;br /&gt;
//вставляем в контрол&lt;br /&gt;
m_Grid1.SetImageList(&amp;amp;m_ImageList);&lt;br /&gt;
&lt;br /&gt;
//&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Как при помощи IPicture отобразить картинку из файла? ===&lt;br /&gt;
Пример - несложная функция, отображающая картинку из файла&lt;br /&gt;
&lt;br /&gt;
поддерживаются форматы&lt;br /&gt;
BMP, GIF, JPEG, PNG, TIFF, EMF&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;quot;atlconv.h&amp;quot;&lt;br /&gt;
#define HandleIsValid(H) (H!=(HANDLE)-1 &amp;amp;&amp;amp; H!=(HANDLE)0)&lt;br /&gt;
&lt;br /&gt;
//*pDestDC - CDC, на который предполагается вывод картинки&lt;br /&gt;
//pchzFilePath - путь к файлу&lt;br /&gt;
//pWid - (возвращает) ширина картинки&lt;br /&gt;
//pHig - (возвращает) высота картинки&lt;br /&gt;
bool DrawBitmapFromFile(CDC* pDestDC,const char* pchzFilePath,int *pWid=0,int *pHig=0)&lt;br /&gt;
{&lt;br /&gt;
	bool result=false;&lt;br /&gt;
&lt;br /&gt;
	if(pWid)*pWid=0;&lt;br /&gt;
	if(pHig)*pHig=0;&lt;br /&gt;
&lt;br /&gt;
	int Wid=0;&lt;br /&gt;
	int Hig=0;&lt;br /&gt;
&lt;br /&gt;
	IPicture* pPic=0;&lt;br /&gt;
	try&lt;br /&gt;
	{&lt;br /&gt;
		IPicture* ptmpPic=0;&lt;br /&gt;
		USES_CONVERSION;&lt;br /&gt;
		HRESULT hr;&lt;br /&gt;
&lt;br /&gt;
		CString txt=pchzFilePath;&lt;br /&gt;
		hr= ::OleLoadPicturePath(&lt;br /&gt;
			const_cast&amp;lt;LPOLESTR&amp;gt;(T2COLE(txt)),&lt;br /&gt;
			0,0,0,IID_IPicture,&lt;br /&gt;
			reinterpret_cast&amp;lt;void **&amp;gt;(&amp;amp;ptmpPic)&lt;br /&gt;
			);&lt;br /&gt;
&lt;br /&gt;
		if(hr==S_OK &amp;amp;&amp;amp; ptmpPic)&lt;br /&gt;
		{&lt;br /&gt;
			pPic=ptmpPic;&lt;br /&gt;
		}&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			throw 0;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		OLE_XPOS_HIMETRIC cxSrc;&lt;br /&gt;
		OLE_YPOS_HIMETRIC cySrc;&lt;br /&gt;
&lt;br /&gt;
		if(S_OK!=pPic-&amp;gt;get_Width(&amp;amp;cxSrc))throw 0;&lt;br /&gt;
		if(S_OK!=pPic-&amp;gt;get_Height(&amp;amp;cySrc))throw 0;&lt;br /&gt;
&lt;br /&gt;
		Wid=cxSrc/26;&lt;br /&gt;
		Hig=cySrc/26;&lt;br /&gt;
&lt;br /&gt;
		//рисуем&lt;br /&gt;
		if(S_OK !=pPic-&amp;gt;Render(pDestDC-&amp;gt;GetSafeHdc(),&lt;br /&gt;
			0,Hig,Wid,-Hig,0,0,cxSrc,cySrc,0))throw 0;&lt;br /&gt;
	}&lt;br /&gt;
	catch(...)&lt;br /&gt;
	{&lt;br /&gt;
		result=false;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if(pPic)&lt;br /&gt;
	{&lt;br /&gt;
		pPic-&amp;gt;Release();&lt;br /&gt;
		pPic=0;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	if(pWid)*pWid=Wid;&lt;br /&gt;
	if(pHig)*pHig=Hig;&lt;br /&gt;
&lt;br /&gt;
	return result;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===У меня модальное диалоговое окно, в нем поле редактирования мультилайновое, т.е. чтобы перейти на новую строку надо нажать ентер, но вызывается стандартный обработчик диалогового окна. Подскажите, что делать?===&lt;br /&gt;
Нужно в редакторе ресурсов поставить для CEdit окошка галочку&lt;br /&gt;
свойства WantReturn,&lt;br /&gt;
&lt;br /&gt;
или добавить ES_WANTRETURN при создании CEdit контрола динамически.&lt;br /&gt;
===Как выводят картинку-логотип(splash screen) при запуске программы? То есть, когда загружается программа на экран выводится картинка, потом она исчезает(загрузка программы закончена) и пользователь может приступать к работе ===&lt;br /&gt;
Для этого используется класс, производный от CDialog. Этот диалог после создания показывает себя на экран, выводя на себя рисунок. Также запускает таймер, по срабатывани которого диалог гасится. Создаётся диалог InitInstance приложения.&lt;br /&gt;
&lt;br /&gt;
В VC6++ также есть уже готовый компонент&lt;br /&gt;
Project-&amp;gt;Add To Project -&amp;gt; Components and Controls-&amp;gt;(в папке &amp;quot;Visual C++ Components&amp;quot; есть SplashScreen.)&lt;br /&gt;
&lt;br /&gt;
===Как сделать, чтобы при выпадении списка у ComboBox была не одна строка, а больше, вроде все свойства покрутил, не помогает Вместо выпадающего списка одна строка и скролл...===&lt;br /&gt;
В редакторе ресурсов надо щелкнуть в комбобоксе на треугольнике - появляется рамка для растягивания вниз - размер выпадающего списка.&lt;br /&gt;
===В VC++.net, что делать после того, как на форму установил ActiveX ListView, как объявить класс и переменную для этого элемента?===&lt;br /&gt;
Щёлкнуть правой кнопкой мыши на элементе, в меню - add variable или add class&lt;br /&gt;
&lt;br /&gt;
===Как вставить данные в буфер обмена (Clipboard)? Как их оттуда вытащить?===&lt;br /&gt;
&lt;br /&gt;
1) копирование в буфер обмена:&lt;br /&gt;
&lt;br /&gt;
  1.Готовим данные&lt;br /&gt;
    а.Выделяем память из кучи,  вызывая GlobalAlloc()&lt;br /&gt;
    б.Получаем указатель на выделенную память, вызывая GlobalLock()&lt;br /&gt;
    в.Заполняем данные&lt;br /&gt;
    г.Освобождаем указатель, вызывая GlobalUnlock();&lt;br /&gt;
&lt;br /&gt;
  2.Открываем буфер обмена, вызывая OpenClipboard();&lt;br /&gt;
  3.Очищаем буфер, вызывая EmptyClipboard();&lt;br /&gt;
  4.Вызываем SetClipboardData() один раз для каждого формата&lt;br /&gt;
      вставляемых данных (имеется в виду - если одни и те же&lt;br /&gt;
      данные представлены в разных форматах, и приложение&lt;br /&gt;
      может эти форматы создать)&lt;br /&gt;
  5.Закрываем буфер, вызывая CloseClipboard();&lt;br /&gt;
  6.ВЫЗЫВАТЬ GlobalFree() НЕ НУЖНО, в этом случае это&lt;br /&gt;
      предоставлено системе&lt;br /&gt;
&lt;br /&gt;
Скажем, хотим поместить в буфер обмена текст.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	//готовим данные&lt;br /&gt;
	//выделяем из кучи память для данных&lt;br /&gt;
	HANDLE hglbCopy = GlobalAlloc(GMEM_MOVEABLE,10);&lt;br /&gt;
	if(!hglbCopy)return;&lt;br /&gt;
&lt;br /&gt;
	//получаем указатель&lt;br /&gt;
	void* lpStr = GlobalLock(hglbCopy);&lt;br /&gt;
	if(!lpStr)return;&lt;br /&gt;
&lt;br /&gt;
	//заполняем данные&lt;br /&gt;
	strcpy((char*)lpStr,&amp;quot;my text&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	//освобождаем указатель&lt;br /&gt;
	GlobalUnlock(hglbCopy);&lt;br /&gt;
	lpStr=0;&lt;br /&gt;
&lt;br /&gt;
	//открываем буфер обмена&lt;br /&gt;
	OpenClipboard();&lt;br /&gt;
	//очищаем&lt;br /&gt;
	EmptyClipboard();&lt;br /&gt;
&lt;br /&gt;
	//текстовый формат&lt;br /&gt;
	SetClipboardData(CF_TEXT,hglbCopy);&lt;br /&gt;
&lt;br /&gt;
	//закрываем буфер&lt;br /&gt;
	CloseClipboard();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
2) извлечение из буфера обмена&lt;br /&gt;
&lt;br /&gt;
  1.Проверяем, что поддерживается нужный формат данных,&lt;br /&gt;
      вызывая IsClipboardFormatAvailable()&lt;br /&gt;
  2.Открываем буфер обмена, вызывая OpenClipboard();&lt;br /&gt;
  3.Достаём данные&lt;br /&gt;
   а.Получаем из буфера хендл требуемого формата,&lt;br /&gt;
      вызывая GetClipboardData()&lt;br /&gt;
    б.Получаем указатель на выделенную память, вызывая GlobalLock()&lt;br /&gt;
    в.Работаем с данными&lt;br /&gt;
    г.Освобождаем указатель, вызывая GlobalUnlock();&lt;br /&gt;
  4.Закрываем буфер, вызывая CloseClipboard();&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	//Проверяем, что поддерживается нужный формат данных,&lt;br /&gt;
	if(!IsClipboardFormatAvailable(CF_TEXT))return;&lt;br /&gt;
&lt;br /&gt;
	//открываем буфер обмена&lt;br /&gt;
	OpenClipboard();&lt;br /&gt;
&lt;br /&gt;
	//достаём данные&lt;br /&gt;
&lt;br /&gt;
	//текстовый формат&lt;br /&gt;
	HANDLE hglbCopy = GetClipboardData(CF_TEXT);&lt;br /&gt;
	if(!hglbCopy)return;&lt;br /&gt;
&lt;br /&gt;
	//получаем указатель&lt;br /&gt;
	void* lpStr = GlobalLock(hglbCopy);&lt;br /&gt;
	if(!lpStr)return;&lt;br /&gt;
&lt;br /&gt;
	//читаем данные&lt;br /&gt;
	char data[10];&lt;br /&gt;
	memmove(data,lpStr,sizeof(data));&lt;br /&gt;
&lt;br /&gt;
	//освобождаем указатель&lt;br /&gt;
	GlobalUnlock(hglbCopy);&lt;br /&gt;
	lpStr=0;&lt;br /&gt;
&lt;br /&gt;
	//закрываем буфер&lt;br /&gt;
	CloseClipboard();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Как получить полный путь к экзешнику из самой программы ?===&lt;br /&gt;
В командную строку первым параметром система всегда передаёт заключённый в кавычки полный путь к файлу запущенной программы Достаём путь таким образом :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
BOOL CMyApp::InitInstance()&lt;br /&gt;
{&lt;br /&gt;
	//добыча полного имени экзешника&lt;br /&gt;
	CString csFullExeName;&lt;br /&gt;
	{&lt;br /&gt;
		CString csAppName=GetCommandLine();&lt;br /&gt;
		csAppName.Delete(0,1);&lt;br /&gt;
		csAppName.Replace('\&amp;quot;','\0');&lt;br /&gt;
		csFullExeName=(const char*)csAppName;&lt;br /&gt;
	}&lt;br /&gt;
	//теперь csFullExeName - содержит искомый путь&lt;br /&gt;
&lt;br /&gt;
	//...&lt;br /&gt;
	//...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Каким способом можно exe файл может заменить самого себя? То есть, моя программа обновляется, например, через Internet, и хочет обновить свой exe-файл. Но так как он в данный момент запущен - это будет, естественно, запрещено. Как это можно проще всего сделать?===&lt;br /&gt;
Один из способов - сделать копию экзешника и из него обновиться&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define def_exeNAMEup	&amp;quot;c:\\myprog_update.exe&amp;quot;&lt;br /&gt;
#define def_exeNAMEdnld	&amp;quot;c:\\myprog_downloaded.exe&amp;quot;&lt;br /&gt;
#define def_keyUdate	&amp;quot;/update&amp;quot;&lt;br /&gt;
&lt;br /&gt;
void CTESTFAQApp::UpdateItself()&lt;br /&gt;
{&lt;br /&gt;
	//добыча полного имени экзешника&lt;br /&gt;
	CString csFullExeName;&lt;br /&gt;
	{&lt;br /&gt;
		CString csAppName=GetCommandLine();&lt;br /&gt;
		csAppName.Delete(0,1);&lt;br /&gt;
		csAppName.Replace('\&amp;quot;','\0');&lt;br /&gt;
		csFullExeName=(const char*)csAppName;&lt;br /&gt;
	}&lt;br /&gt;
	//теперь csFullExeName - содержит искомый путь&lt;br /&gt;
&lt;br /&gt;
	//делаем копию экзешника с другим именем&lt;br /&gt;
	CopyFile(csFullExeName,def_exeNAMEup,0);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	//передаём в параметры нового процесса ключ и путь к текущему файлу&lt;br /&gt;
	CString csParams=def_keyUdate;&lt;br /&gt;
	csParams+=&amp;quot; &amp;quot;;&lt;br /&gt;
	csParams+=csFullExeName;&lt;br /&gt;
&lt;br /&gt;
	//запускаем копию&lt;br /&gt;
	STARTUPINFO si;&lt;br /&gt;
	PROCESS_INFORMATION pi;&lt;br /&gt;
	ZeroMemory(&amp;amp;si,sizeof(si));&lt;br /&gt;
	si.cb = sizeof(si);&lt;br /&gt;
	ZeroMemory(&amp;amp;pi,sizeof(pi));&lt;br /&gt;
	if(CreateProcess(def_exeNAMEup,def_keyUdate,0,0,0,0,0,0,&amp;amp;si,&amp;amp;pi))&lt;br /&gt;
	{&lt;br /&gt;
		//завершаем текущий процесс&lt;br /&gt;
		ExitFromMyApp();&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void CTESTFAQApp::ExitFromMyApp()&lt;br /&gt;
{&lt;br /&gt;
	exit(0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
BOOL CTESTFAQApp::InitInstance()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
	//смотрим, не запустили ли для апдейта?&lt;br /&gt;
&lt;br /&gt;
	CString txt;&lt;br /&gt;
	txt=m_lpCmdLine;&lt;br /&gt;
	if(txt.Find(def_keyUdate)==0)&lt;br /&gt;
	{&lt;br /&gt;
		//делаем айдейт&lt;br /&gt;
		txt.Replace(def_keyUdate,&amp;quot;&amp;quot;);&lt;br /&gt;
		txt.TrimLeft();&lt;br /&gt;
&lt;br /&gt;
		CString csFullExeName=txt;&lt;br /&gt;
&lt;br /&gt;
		//берём откуда то уже скачанный файл обновления&lt;br /&gt;
		//...&lt;br /&gt;
		CString csFull_Downloaded_ExeName=def_exeNAMEdnld;&lt;br /&gt;
&lt;br /&gt;
		//копируем файл (обновляем старый то есть)&lt;br /&gt;
		CopyFile(csFull_Downloaded_ExeName,csFullExeName,0);&lt;br /&gt;
&lt;br /&gt;
		//запускаем обновлённого мученника&lt;br /&gt;
		STARTUPINFO si;&lt;br /&gt;
		PROCESS_INFORMATION pi;&lt;br /&gt;
		ZeroMemory(&amp;amp;si,sizeof(si));&lt;br /&gt;
		si.cb = sizeof(si);&lt;br /&gt;
		ZeroMemory(&amp;amp;pi,sizeof(pi));&lt;br /&gt;
		if(CreateProcess(csFullExeName,0,0,0,0,0,0,0,&amp;amp;si,&amp;amp;pi))&lt;br /&gt;
&lt;br /&gt;
		ExitFromMyApp();&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
	//...&lt;br /&gt;
	//...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Есть строка символов (страничка из Инета) в кодировке utf-8 (строка char*). Как мне ее получить в формате String&lt;br /&gt;
или в char* в кодировке ANSI (cp 1251) ?===&lt;br /&gt;
Можно перевести строку из UTF8 в Unicode, затем из Unicode в 1251&lt;br /&gt;
&lt;br /&gt;
Ниже приведена структура, содержащая процедуры перекодирования,&lt;br /&gt;
а также процедуру с примером использования&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//описание структуры&lt;br /&gt;
struct coder&lt;br /&gt;
{&lt;br /&gt;
	//utf8-&amp;gt;unicode&lt;br /&gt;
	static wchar_t* utf8_to_unicode__dontForgetDeleteArr(const char *utf8_string)&lt;br /&gt;
	{&lt;br /&gt;
		wchar_t* pRes=0;&lt;br /&gt;
		int res_len=0;&lt;br /&gt;
&lt;br /&gt;
		//тест на возможность преобразования&lt;br /&gt;
		res_len=MultiByteToWideChar(CP_UTF8,0,utf8_string,-1,0,0);&lt;br /&gt;
		if(!res_len)return 0;&lt;br /&gt;
&lt;br /&gt;
		//выделяем память&lt;br /&gt;
		pRes = new wchar_t[res_len];&lt;br /&gt;
		if(!pRes)return 0;&lt;br /&gt;
&lt;br /&gt;
		//преобразование&lt;br /&gt;
		if(!MultiByteToWideChar(CP_UTF8,0,utf8_string,-1,pRes,res_len))&lt;br /&gt;
		{&lt;br /&gt;
			delete [] pRes;&lt;br /&gt;
			return 0;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		return pRes;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	//unicode-&amp;gt;1251&lt;br /&gt;
	static char * unicode_to_1251__dontForgetDeleteArr(const wchar_t *unicode_string)&lt;br /&gt;
	{&lt;br /&gt;
		char* pRes=0;&lt;br /&gt;
		int res_len=0;&lt;br /&gt;
&lt;br /&gt;
		//тест на возможность преобразования&lt;br /&gt;
		res_len = WideCharToMultiByte(1251,0,unicode_string,-1,0,0,0,0);&lt;br /&gt;
		if(!res_len)return 0;&lt;br /&gt;
&lt;br /&gt;
		//выделяем память&lt;br /&gt;
		pRes=new char[res_len];&lt;br /&gt;
		if(!pRes)return 0;&lt;br /&gt;
&lt;br /&gt;
		//преобразование&lt;br /&gt;
		if(!WideCharToMultiByte(1251,0,unicode_string,-1,pRes,res_len,0,0))&lt;br /&gt;
		{&lt;br /&gt;
			delete [] pRes;&lt;br /&gt;
			return 0;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		return pRes;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	//процедура с примером&lt;br /&gt;
	static void Example()&lt;br /&gt;
	{&lt;br /&gt;
		wchar_t* unicode_string=0;&lt;br /&gt;
		char* cp1251_string=0;&lt;br /&gt;
&lt;br /&gt;
		//исходный текст&lt;br /&gt;
		char utf8_string[] = &amp;quot;UTF-8 + СЂСѓСЃСЃРєРёР№ С‚РµРєСЃС‚&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
		for(;;)&lt;br /&gt;
		{&lt;br /&gt;
&lt;br /&gt;
			unicode_string=utf8_to_unicode__dontForgetDeleteArr(utf8_string);&lt;br /&gt;
			if(!unicode_string)&lt;br /&gt;
			{&lt;br /&gt;
				AfxMessageBox(&amp;quot;Не удалось конвертировать в unicode!&amp;quot;);&lt;br /&gt;
				break;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			cp1251_string = unicode_to_1251__dontForgetDeleteArr(unicode_string);&lt;br /&gt;
&lt;br /&gt;
			if(!cp1251_string)&lt;br /&gt;
			{&lt;br /&gt;
				AfxMessageBox(&amp;quot;Не удалось конвертировать из unicode!&amp;quot;);&lt;br /&gt;
				break;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			break;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		//cp1251_string - результат&lt;br /&gt;
		AfxMessageBox(cp1251_string);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
		//не забываем удалить массивы&lt;br /&gt;
		if(unicode_string)&lt;br /&gt;
		{&lt;br /&gt;
			delete [] unicode_string;&lt;br /&gt;
			unicode_string=0;&lt;br /&gt;
		}&lt;br /&gt;
		if(cp1251_string)&lt;br /&gt;
		{&lt;br /&gt;
			delete [] cp1251_string;&lt;br /&gt;
			cp1251_string=0;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
//вызов примера&lt;br /&gt;
coder::Example();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как организовать взаимодействие программы на VC.net с Access-овской базой данных?===&lt;br /&gt;
Проще всего подключить ADO компоненты и сделать все на них.&lt;br /&gt;
Компоненты  ADO (ADODC,DATAGRID и т.п.) это ActiveX.&lt;br /&gt;
В редакторе ресурсов, во всплывающем меню, есть Insert ActiveX Control -&amp;gt; открывается список всех компоент,&lt;br /&gt;
зарегистрированых на машине. Нужно найти компоненты (Это компоненты от MS и они помечены (OLEDB)) и вставить их в диалог. Для того что бы иметь возможность управлять ими, нужно импортировать обертки для них, это делается при помощи ClassWisard, там есть импорт-&amp;gt;класс-&amp;gt;указать файл с компоентой (OSX).&lt;br /&gt;
Появляется список всех классов, объявленых внутри.&lt;br /&gt;
Проставляем галочки, нажимаем ОК.&lt;br /&gt;
&lt;br /&gt;
[[Category:FAQ]]&lt;/div&gt;</summary>
		<author><name>Mczim</name></author>	</entry>

	<entry>
		<id>https://wiki.shelek.ru/index.php?title=FAQ:WinAPI,_VCPP_Part_3&amp;diff=421</id>
		<title>FAQ:WinAPI, VCPP Part 3</title>
		<link rel="alternate" type="text/html" href="https://wiki.shelek.ru/index.php?title=FAQ:WinAPI,_VCPP_Part_3&amp;diff=421"/>
				<updated>2008-08-14T19:01:29Z</updated>
		
		<summary type="html">&lt;p&gt;Mczim: пробел перед запятыми + ActiiveX ListView &amp;gt; ActiveX ListView&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Имеется приложение на основе CRichEditView. Как узнать, что пользователь меняет текст?===&lt;br /&gt;
Добавить обработчик сообщения EN_CHANGE. Сообщение генерируется CRichEditView каждый раз, когда пользователь изменяет текст в окне CRichEditView&lt;br /&gt;
===Чем метод CArray::GetSize отличается от метода CArray::GetCount?===&lt;br /&gt;
Абсолютно ничем. (Скорее всего, были предыдущие библиотеки, в которых функции, одинаковые по смыслу, имели разные имена. Поэтому в целях совместимости оставили оба)&lt;br /&gt;
===Как загрузить строку из ресурса?===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CString m_Temp;&lt;br /&gt;
m_Temp.LoadString(ID_MYSTRING);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как поменять иконку у элемента (item) в CListCtrl?===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//заполняем структуру LVITEM&lt;br /&gt;
LVITEM lvItem;&lt;br /&gt;
memset(&amp;amp;lvItem,0,sizeof(lvItem));&lt;br /&gt;
	&lt;br /&gt;
lvItem.mask = LVIF_IMAGE;//меняться будет картинка&lt;br /&gt;
lvItem.iItem = ...;// индекс элемента списка (Zero-based)&lt;br /&gt;
lvItem.iSubItem = 0;&lt;br /&gt;
lvItem.iImage = ...; //индекс иконки (из списка контрола)&lt;br /&gt;
	&lt;br /&gt;
pList-&amp;gt;SetItem(&amp;amp; lvItem);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Имеется класс Class1, содержащий мембер типа указатель на Class2. В Class2 также имеется указатель на Class1. Компилятор выдаёт ошибку. Что надо делать?===&lt;br /&gt;
Предварительно объявляем класс Class2. Тогда компилятору будет известно, что описание класса Class2 будет встречено дальше, и станет возможным объявление указателей на класс до описания самого класса.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Class2;//предопределение&lt;br /&gt;
	&lt;br /&gt;
Class1&lt;br /&gt;
{&lt;br /&gt;
	Class2* p;&lt;br /&gt;
};&lt;br /&gt;
	&lt;br /&gt;
Class2&lt;br /&gt;
{&lt;br /&gt;
	Class1* p;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как переключить раскладку в другом (то есть в активном) процессе?===&lt;br /&gt;
Использовать функции:&lt;br /&gt;
   GetKeyboardLayout - определить текущую раскладку&lt;br /&gt;
   LoadKeyboardLayout - загрузить новую раскладку&lt;br /&gt;
&lt;br /&gt;
см.также&lt;br /&gt;
   VerLanguageName - получить строку с описанием языка&lt;br /&gt;
&lt;br /&gt;
(подробности - в MSDN)&lt;br /&gt;
===Как получить хендл контрола Edit зная его ID?===&lt;br /&gt;
Пусть контрол лежит на окне CMyWnd&lt;br /&gt;
Тогда:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void CMyWnd::некая_процедура()&lt;br /&gt;
{&lt;br /&gt;
	//для MFC&lt;br /&gt;
	CEdit* ed=(CEdit* ) GetDlgItem(ID_EDIT1);&lt;br /&gt;
	HWND hwnd=ed-&amp;gt;GetSafeHwnd();&lt;br /&gt;
	...&lt;br /&gt;
	&lt;br /&gt;
	//для Win32 API&lt;br /&gt;
	HWND hwnd=GetDlgItem(m_hWnd,ID_EDIT1);&lt;br /&gt;
	...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Как из дочернего окна закрыть приложение?===&lt;br /&gt;
Нужно послать родительскому окну (*pParent) сообщение WM_CLOSE:&lt;br /&gt;
 pParent-&amp;gt;PostMessage(WM_CLOSE);//MFC&lt;br /&gt;
или&lt;br /&gt;
 ::PostMessage(pParent-&amp;gt;m_hWnd,WM_CLOSE,(WPARAM)0,(LPARAM)0);//API&lt;br /&gt;
===Как корректно перевести BSTR в CString и наоборот?===&lt;br /&gt;
Нужно просто присвоить переменной типа CString переменную типа BSTR.&lt;br /&gt;
Оператор = класса CString сам всё переведёт.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//указатель на будущий буфер с BSTR.&lt;br /&gt;
//	(По сути, BSTR определён как &lt;br /&gt;
//	typedef WCHAR* BSTR;&lt;br /&gt;
//	то есть указатель на 16-битный символ юникод)&lt;br /&gt;
	&lt;br /&gt;
BSTR bstrHE=0;&lt;br /&gt;
	&lt;br /&gt;
CString Str=&amp;quot;мой текст&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
//Выделить память и загрузить адрес блока в bstrHE&lt;br /&gt;
bstrHE=Str.AllocSysString();&lt;br /&gt;
	&lt;br /&gt;
//...	&lt;br /&gt;
//тут работаем с bstrHE[]&lt;br /&gt;
//...&lt;br /&gt;
	&lt;br /&gt;
//освобождаем память&lt;br /&gt;
SysFreeString(bstrHE);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Как получить доступ к графическим ресурсам элементов текущей темы оформления Windows?===&lt;br /&gt;
Использовать функции&lt;br /&gt;
&lt;br /&gt;
OpenThemeData()&lt;br /&gt;
DrawThemeBackground()&lt;br /&gt;
DrawFrameControl()&lt;br /&gt;
CloseThemeData().&lt;br /&gt;
&lt;br /&gt;
(подробности - в MSDN)&lt;br /&gt;
===Имеется класс , производный от CDialog. Когда диалог в фокусе, нажатие на Enter или Esc приводит к закрытию диалога. Как это запретить?===&lt;br /&gt;
При нажатии Enter происходит выполнение команды IDOK,&lt;br /&gt;
при нажатии Esc - IDCANCEL.&lt;br /&gt;
Нужно переопределить в классе виртуальные функции OnOk() и OnCancel(),&lt;br /&gt;
которые соответственно вызываются для этих команд. При помощи&lt;br /&gt;
визарда эти функции добавить можно так: Положить на диалог две кнопки&lt;br /&gt;
с идентификаторами IDOK и IDCANCEL (при создании нового диалога они там&lt;br /&gt;
есть сразу), затем двойной клик по кнопке добавляет соответствующий&lt;br /&gt;
обработчик. В обработчиках надо удалить вызовы СDialog::OnOK() и&lt;br /&gt;
CDialog::OnCancel(), тогда диалог закрываться не будет.&lt;br /&gt;
Однако тогда диалог станет невозможно закрыть кнопкой с крестиком  :)&lt;br /&gt;
&lt;br /&gt;
Лечить так: добавить обработчик сообщения WM_CLOSE - OnClose(), и в нём&lt;br /&gt;
сделать вызов OnOk() или OnCancel() :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void CPlayersPropsDialog::OnClose() &lt;br /&gt;
{&lt;br /&gt;
	CDialog::OnClose();&lt;br /&gt;
	CDialog::OnCancel();//добавлено&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===VC++6. Я написал простейший макрос, а компилятор на него ругается. Ума не приложу, что за глюк?===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	#define my_macr(x,y,z) \&lt;br /&gt;
		z=\&lt;br /&gt;
		(x+y)*\&lt;br /&gt;
		(x-y)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Скорее всего после одного из символов соединения строк &amp;quot;\&amp;quot; имеется&lt;br /&gt;
пробел или табуляция. Их надо удалить. Можно найти их &amp;quot;наощупь&amp;quot;, а&lt;br /&gt;
можно включить показ непечатных символов в студии. Найти эту команду&lt;br /&gt;
можно так:&lt;br /&gt;
Tools-&amp;gt;Customize...-&amp;gt;вкладка Commands. В окошке Category выбрать&lt;br /&gt;
&amp;quot;Edit&amp;quot;, и среди кнопок справа найти кнопку, на которой написано &amp;quot;a.b&amp;quot;&lt;br /&gt;
Эту кнопку надо перетащить на одну из панелей инструментов студии.&lt;br /&gt;
&lt;br /&gt;
===Как получить список всех процесов, включая idle?===&lt;br /&gt;
Использовать функции&lt;br /&gt;
Process32First()&lt;br /&gt;
Precess32Next()&lt;br /&gt;
&lt;br /&gt;
===Как программно установить переменные окружения?===&lt;br /&gt;
Чтобы добавить или изменить их программно, необходимо воспользоваться&lt;br /&gt;
ключом реестра HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\&lt;br /&gt;
Session Manager\Environment, а затем отправить широковещательное&lt;br /&gt;
сообщение WM_SETTINGCHANGE. Это позволит приложениям узнать об&lt;br /&gt;
изменениях:&lt;br /&gt;
&lt;br /&gt;
::SendMessage(HWND_BROADCAST,WM_SETTINGCHANGE,0,0);&lt;br /&gt;
===Как сделать, чтобы у окна был черный фон?===&lt;br /&gt;
переопределить обработчик сообщения WM_CTLCOLOR - OnCtlColor() :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CBrush br(RGB(0,0,0));&lt;br /&gt;
	&lt;br /&gt;
HBRUSH CMyDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) &lt;br /&gt;
{&lt;br /&gt;
	HBRUSH hbr = CMyDlg::OnCtlColor(pDC, pWnd, nCtlColor);&lt;br /&gt;
	&lt;br /&gt;
	//фон диалога (или вьюшки)&lt;br /&gt;
	if(nCtlColor==CTLCOLOR_DLG)&lt;br /&gt;
	{&lt;br /&gt;
		return (HBRUSH)br;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	//фон статиков (если нужно)&lt;br /&gt;
	if(nCtlColor==CTLCOLOR_STATIC)&lt;br /&gt;
	{&lt;br /&gt;
		//делаем фон текста статика прозрачным&lt;br /&gt;
		pDC-&amp;gt;SetBkMode(TRANSPARENT);&lt;br /&gt;
		return (HBRUSH)br;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	return hbr;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Почему на моем компьютере экзешник, созданный в MFC запускается, а на других компьютерах - нет? Требует какую-то  dll-ку.===&lt;br /&gt;
Нужно выбирать режим Release :&lt;br /&gt;
&lt;br /&gt;
Menu-&amp;gt;Build-&amp;gt;Configurations...-&amp;gt;Release,&lt;br /&gt;
&lt;br /&gt;
и экзешник, соответственно, брать из папки Release проекта&lt;br /&gt;
===Как в диалог добавить меню?===&lt;br /&gt;
Надо сделать в ресурсах меню, затем вставить в диалог:&lt;br /&gt;
&lt;br /&gt;
открыть в редакторе диалог, в свойствах (во вкладке General, окошко Menu) указать идентивикатор ресурса меню.&lt;br /&gt;
При помощи визарда добавить для меню обработчики OnCommand() и OnUpdateСommand().&lt;br /&gt;
===Я добавил визардом меню в диалог. Добавил обработчики для пунктов меню. Пункты работают, но OnUpdate для пунктов не вызывается - то есть не получается ни затенить, ни чек поставить. Что делать?===&lt;br /&gt;
В диалоге у меню апдейта не происходит сам, в отличие от мейнфрейма.&lt;br /&gt;
Для этого нужно сделать самим апдейт в обработчике сообщения WM_KICKIDLE.&lt;br /&gt;
Визардом обработчик не добавляется, поэтому можно переопределить виртуальную DefWindowProc() и там обработать:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;afxpriv.h&amp;gt;	//этот файл надо включить, там определёна WM_KICKIDLE&lt;br /&gt;
&lt;br /&gt;
LRESULT CMyDialog::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam) &lt;br /&gt;
{&lt;br /&gt;
	if(message==WM_KICKIDLE)&lt;br /&gt;
	{&lt;br /&gt;
		//делаем апдейт для всех пунктов меню&lt;br /&gt;
		CMenu* pMainMenu=GetMenu();&lt;br /&gt;
		if(pMainMenu)&lt;br /&gt;
		{&lt;br /&gt;
			CCmdUI cmdUI;&lt;br /&gt;
			for (UINT n=0; n &amp;lt; pMainMenu-&amp;gt;GetMenuItemCount(); ++n)&lt;br /&gt;
			{&lt;br /&gt;
				CMenu* pSubMenu = pMainMenu-&amp;gt;GetSubMenu(n);&lt;br /&gt;
				if(!pSubMenu)continue;&lt;br /&gt;
	&lt;br /&gt;
				cmdUI.m_nIndexMax = pSubMenu-&amp;gt;GetMenuItemCount();&lt;br /&gt;
				for (UINT i = 0; i &amp;lt; cmdUI.m_nIndexMax;++i)&lt;br /&gt;
				{&lt;br /&gt;
					cmdUI.m_nIndex = i;&lt;br /&gt;
					cmdUI.m_nID = pSubMenu-&amp;gt;GetMenuItemID(i);&lt;br /&gt;
					cmdUI.m_pMenu = pSubMenu;&lt;br /&gt;
					cmdUI.DoUpdate(this, FALSE);&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	return CDialog::DefWindowProc(message, wParam, lParam);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Как на Visual C++ 6.0 в Главном окне отключить системное меню (в левом верхнем углу) и кнопки(в правом верхнем углу)?===&lt;br /&gt;
При создании окна нужно убрать стиль WS_SYSMENU&lt;br /&gt;
(теперь пользователь корректно может закрыть окно только Alt+F4,&lt;br /&gt;
ну или если вы предоставите ему дополнительную возможность сделать это)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пример 1. (для SDI, MDI)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//этот обработчик уже добавлен визардом&lt;br /&gt;
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT&amp;amp; cs)&lt;br /&gt;
{&lt;br /&gt;
	if( !CFrameWnd::PreCreateWindow(cs) )&lt;br /&gt;
		return FALSE;&lt;br /&gt;
	// TODO: Modify the Window class or styles here by modifying&lt;br /&gt;
	//  the CREATESTRUCT cs&lt;br /&gt;
&lt;br /&gt;
	///////////////////////////////&lt;br /&gt;
	//добавленная часть&lt;br /&gt;
	{&lt;br /&gt;
		//убираем стиль&lt;br /&gt;
		cs.style&amp;amp;=~WS_SYSMENU;&lt;br /&gt;
	}&lt;br /&gt;
	///////////////////////////////&lt;br /&gt;
&lt;br /&gt;
	return TRUE;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Пример 2. (для диалога)&lt;br /&gt;
Если диалог описан в ресурсах, то в свойствах диалога убрать галочки&lt;br /&gt;
  &amp;quot;System menu&amp;quot;&lt;br /&gt;
  &amp;quot;Minimize box&amp;quot;&lt;br /&gt;
  &amp;quot;Maximize box&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===Хочу сделать так, чтобы пользователь не мог нажать на кнопку, пока программа не разрешит.===&lt;br /&gt;
Нужно применить метод класса CWnd::EnableWindow(...) для кнопки.&lt;br /&gt;
Значение параметра 0 делает кнопку неактивной, 1 - делает активной.&lt;br /&gt;
(кстате, не только для кнопки можно, а для любого класса, производного&lt;br /&gt;
от класса CWnd)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пусть имеется некий диалог, на нём лежит кнопка c ID == IDC_1.&lt;br /&gt;
в любом месте кода диалога (кроме конструктора и деструктора , хотя, если&lt;br /&gt;
проверить наличие валидного хендла диалога, как в примере, то ничего&lt;br /&gt;
страшного не будет и там)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//делаем кнопку неактивной&lt;br /&gt;
if(m_hWnd)&lt;br /&gt;
{&lt;br /&gt;
	CWnd* pw=0;&lt;br /&gt;
	pw=GetDlgItem(IDC_1);&lt;br /&gt;
	if(pw)pw-&amp;gt;EnableWindow(0);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Что означают сообщения, которые студия выводит при компиляции, вроде таких : Loaded 'C:\WINDOWS\SYSTEM\WSOCK32.DLL', no matching symbolic information found. ===&lt;br /&gt;
Это строка говорит о том, что студия не смогла найти отладочные&lt;br /&gt;
символы для WSOCK32.DLL. В этом нет ничего страшного, просто при наличии&lt;br /&gt;
отладочных символов в процессе отладки можно получить доступ к именам&lt;br /&gt;
функции из системных DLL. Например, вместо&lt;br /&gt;
 KERNEL32! 0x77E8B184() -&lt;br /&gt;
 увидим&lt;br /&gt;
 KERNEL32!CreateThread.&lt;br /&gt;
===Как обработать сообщения, которое приходит к некому контролу (скажем CEdit)?===&lt;br /&gt;
Нужно произвести от CEdit свой класс, и в виртуальной процедуре класса WindowProc перехватить нужные сообщения.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
virtual LRESULT WindowProc(&lt;br /&gt;
   UINT message,&lt;br /&gt;
   WPARAM wParam,&lt;br /&gt;
   LPARAM lParam &lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Пример. Полностью выключаем, скажем, обработку сообщения WM_CHAR&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	LRESULT CMyEdit::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) &lt;br /&gt;
	{&lt;br /&gt;
		switch(message)&lt;br /&gt;
		{&lt;br /&gt;
			case WM_CHAR:&lt;br /&gt;
			{&lt;br /&gt;
				return 0;&lt;br /&gt;
			}&lt;br /&gt;
			break;&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		return CEdit::WindowProc(message, wParam, lParam);&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Чтобы связать экземпляр класса с контролом на форме, добавьте визардом для&lt;br /&gt;
контрола переменную класса (выбрав не Value а Control).&lt;br /&gt;
&lt;br /&gt;
===Как настроить количество пробелов в табуляции?===&lt;br /&gt;
Tools-&amp;gt;Options-&amp;gt;Tabs-&amp;gt;Insert Spaces&lt;br /&gt;
(или  правой кнопкой мыши по тексту-&amp;gt; properties)&lt;br /&gt;
===Как автоматически расставить отступы?===&lt;br /&gt;
Выделить текст для форматирования, нажать Alt+F8&lt;br /&gt;
&lt;br /&gt;
Есть ещё программа Artistic Style, которая занимается&lt;br /&gt;
переформатированием кода&lt;br /&gt;
http://sourceforge.net/projects/astyle/&lt;br /&gt;
===Поиск границ блока===&lt;br /&gt;
&amp;quot;CTRL+ }&amp;quot; ищет парную фигурную скобку в тексте и переходит на неё&lt;br /&gt;
===Вертикальное выделение текста===&lt;br /&gt;
&amp;quot;Alt + выделение мышкой&amp;quot; - позволяет выделять вертикальные фрагменты текста&lt;br /&gt;
===Как узнать количество установленных в CListCtrl столбцов?===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CListCtrl* pL=...; //указатель на переменную-контрол&lt;br /&gt;
&lt;br /&gt;
int count=pL-&amp;gt;GetHeaderCtrl()-&amp;gt;GetItemCount();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Как получить иконку приложения?===&lt;br /&gt;
Если приложение запущено, то нужно найти его главное окно и&lt;br /&gt;
послать ему сообщение WM_GETICON.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//функция возвращант хендл иконки &lt;br /&gt;
LRESULT SendMessage(hWnd, WM_GETICON, wParam, 0);&lt;br /&gt;
&lt;br /&gt;
//hWnd == хендл окна приложения&lt;br /&gt;
//wParam == &lt;br /&gt;
//	1)==ICON_BIG - получить большую иконку&lt;br /&gt;
//	2)==ICON_SMALL - получить маленькую иконку&lt;br /&gt;
//	3)==ICON_SMALL2 - получить маленькую иконку, если она определена&lt;br /&gt;
//				в приложении. Если её нет, то маленькую иконку, &lt;br /&gt;
//				сгенерированную системой из большой иконки&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как в CString можно найти или вырезать часть строки?===&lt;br /&gt;
есть такие методы в CString:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//вырезает кусок строки&lt;br /&gt;
CString Mid(int nFirst) const;&lt;br /&gt;
CString Mid(int nFirst,  int nCount) const;&lt;br /&gt;
&lt;br /&gt;
//возвращает кусок строки (сначала или с конца)&lt;br /&gt;
CString Left(int nCount ) const;&lt;br /&gt;
CString Right(int nCount ) const;&lt;br /&gt;
&lt;br /&gt;
//возвращает начальный кусок строки, в котором есть только&lt;br /&gt;
//символы из набора,представленного в lpszCharSet&lt;br /&gt;
CString SpanIncluding(LPCTSTR lpszCharSet ) const;&lt;br /&gt;
&lt;br /&gt;
//возвращает начальный кусок строки, в котором нет&lt;br /&gt;
//символов из набора,представленного в lpszCharSet&lt;br /&gt;
CString SpanExcluding(LPCTSTR lpszCharSet ) const; &lt;br /&gt;
&lt;br /&gt;
//убирает &amp;quot;пробелоподобные&amp;quot; символы из самого начала строки&lt;br /&gt;
//(то есть - пробел, табуляцию (\t) , возврат каретки, перевод строки (/r/n))&lt;br /&gt;
void TrimLeft();&lt;br /&gt;
//убирает все повторы символа из самого начала строки&lt;br /&gt;
void TrimLeft(TCHAR chTarget );&lt;br /&gt;
//убирает из самого начала строки все символа из набора lpszTargets &lt;br /&gt;
void TrimLeft(LPCTSTR lpszTargets ); &lt;br /&gt;
&lt;br /&gt;
void TrimRight();&lt;br /&gt;
void TrimRight(TCHAR chTarget );&lt;br /&gt;
void TrimRight(LPCTSTR lpszTargets ); &lt;br /&gt;
&lt;br /&gt;
//поиск в строке&lt;br /&gt;
int Find( TCHAR ch ) const;&lt;br /&gt;
int Find( LPCTSTR lpszSub ) const;&lt;br /&gt;
int Find( TCHAR ch, int nStart ) const;&lt;br /&gt;
int Find( LPCTSTR pstr, int nStart ) const;&lt;br /&gt;
&lt;br /&gt;
//поиск, начиная с конца&lt;br /&gt;
int ReverseFind( TCHAR ch ) const;&lt;br /&gt;
&lt;br /&gt;
//поиск позиции первого символа, одного из набора,&lt;br /&gt;
// представленного в lpszCharSet&lt;br /&gt;
int FindOneOf( LPCTSTR lpszCharSet ) const;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Есть у меня CListBox и я в ходе выполнения программы добавляю в него строки. Но я не могу посмотреть что именно добавляется. Вывод результатов происходит в конце выполнения процедуры...===&lt;br /&gt;
Если нужно делать принудительную перерисовку окна во время&lt;br /&gt;
длительных вычислений, то нужно вызывать для окна, которое&lt;br /&gt;
надо перерисовать метод&lt;br /&gt;
  RedrawWindow()&lt;br /&gt;
с параметрами по умолчанию, или пару&lt;br /&gt;
  Invalidate(0);&lt;br /&gt;
  UpdateWindow();&lt;br /&gt;
Это приводит к пометке всего окна к перерисовке и отправлению&lt;br /&gt;
сообщения WM_PAINT в оконную процедуру в обход очереди&lt;br /&gt;
сообщений, вызывая немедленную перерисовку окна.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CWnd* pw=...;//окно, которое надо перерисовывать&lt;br /&gt;
&lt;br /&gt;
for(int i=0;i&amp;lt;10000)&lt;br /&gt;
{&lt;br /&gt;
	//меняется содержимое окна&lt;br /&gt;
	//...&lt;br /&gt;
&lt;br /&gt;
	//немедленная перерисовка&lt;br /&gt;
	pw-&amp;gt;Invalidate(0);&lt;br /&gt;
	pw-&amp;gt;UpdateWindow();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Я написал DLL, которую используют несколько приложений. Всё вроде работает, но когда происходит очередной вызов функции из DLL, почему то данные в функции обнуляются. С чем это связано?===&lt;br /&gt;
Переменные и массивы в DLL, содержимое которых должно использоваться несколькими процессами, должны объявляться статическими. Статическая переменная или массив инициализируются только один раз в момент загрузки DLL.&lt;br /&gt;
Пример:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DWORD calltest()&lt;br /&gt;
{&lt;br /&gt;
	//будет выполнено только при первом вызове&lt;br /&gt;
	static DWORD callcount=0;&lt;br /&gt;
	static DWORD str[1000]={0}; &lt;br /&gt;
&lt;br /&gt;
	//будет выполняться каждый раз&lt;br /&gt;
	return ++callcount;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Как открыть проекцию файла в память и как с ней работать?===&lt;br /&gt;
Создаем проекцию&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HANDLE CreateFileMapping(&lt;br /&gt;
  HANDLE hFile,	//хендл уже открытого файла&lt;br /&gt;
  LPSECURITY_ATTRIBUTES lpAttributes,&lt;br /&gt;
  DWORD flProtect,	//способ открытия проекции&lt;br /&gt;
  DWORD dwMaximumSizeHigh,	//размер файла (старшие 4 байта , обычно==0)&lt;br /&gt;
  DWORD dwMaximumSizeLow,	//размер файла (младшие 4 байта)&lt;br /&gt;
  LPCTSTR lpName&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Доступ к созданной проекции производится процедурой&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LPVOID MapViewOfFile(&lt;br /&gt;
  HANDLE hFileMappingObject, //хендл проекции&lt;br /&gt;
  DWORD dwDesiredAccess,	//способ работы с проекцией&lt;br /&gt;
  DWORD dwFileOffsetHigh,&lt;br /&gt;
  DWORD dwFileOffsetLow, //смещение от начала файла (младшие 4 байта)&lt;br /&gt;
  SIZE_T dwNumberOfBytesToMap //длина в байтах (если ==0 - то весь файл)&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
далее с файлом можно работать как с обычным массивом в памяти.&lt;br /&gt;
&lt;br /&gt;
После работы с проекцией, её надо освободить процедурой&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
BOOL UnmapViewOfFile(&lt;br /&gt;
  LPCVOID lpBaseAddress //адрес, который вернула процедура MapViewOfFile&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Пример.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HANDLE hMapFile=0;//для проекции&lt;br /&gt;
&lt;br /&gt;
HANDLE hFile=...;//хендл уже открытого файла&lt;br /&gt;
DWORD dwdFileLen=...;//размер открытого файла&lt;br /&gt;
&lt;br /&gt;
//создаём проекцию &amp;quot;только для чтения&amp;quot;&lt;br /&gt;
hMapFile=::CreateFileMapping(hFile,0,PAGE_READONLY,0,dwdFileLen,0);&lt;br /&gt;
&lt;br /&gt;
//хендл hFile можно закрыть уже здесь, в принципе,&lt;br /&gt;
//но мы сделаем это позже&lt;br /&gt;
&lt;br /&gt;
//получаем доступ к проекции (тоже только для чтения)&lt;br /&gt;
BYTE* pbyFile=(BYTE*)::MapViewOfFile(hMapFile,FILE_MAP_READ,0,0,0);&lt;br /&gt;
&lt;br /&gt;
///////////////////&lt;br /&gt;
//тут работаем с массивом pbyFile[dwdFileLen] как с обычным,&lt;br /&gt;
//только не забываем, что он открыт только для чтения&lt;br /&gt;
//...&lt;br /&gt;
//...&lt;br /&gt;
//...&lt;br /&gt;
///////////////////&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//отключаем файл данных от адресного пространства&lt;br /&gt;
UnmapViewOfFile(pbyFile);&lt;br /&gt;
&lt;br /&gt;
//освобождаем хендл проекции&lt;br /&gt;
CloseHandle(hMapFile)&lt;br /&gt;
&lt;br /&gt;
//освобождаем хендл открытого файла&lt;br /&gt;
CloseHandle(hFile);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Использую MFC Grid control 2.25, не получается отобразить картинку в ячейке. Как это делается?===&lt;br /&gt;
Нужно создать список изображений (CImageList), затем передать указатель на список в контрол. Поскольку контрол лишь копирует указатель, список должен создаваться динамически, либо быть членом класса, экземпляр которого существует всё время работы контрола.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 m_GridMarket&lt;br /&gt;
CImageList m_ImageList;&lt;br /&gt;
CGridCtrL m_Grid1&lt;br /&gt;
...&lt;br /&gt;
...&lt;br /&gt;
//неким образом создаётся список&lt;br /&gt;
m_ImageList.Create(...);&lt;br /&gt;
//...&lt;br /&gt;
&lt;br /&gt;
//вставляем в контрол&lt;br /&gt;
m_Grid1.SetImageList(&amp;amp;m_ImageList);&lt;br /&gt;
&lt;br /&gt;
//&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Как при помощи IPicture отобразить картинку из файла? ===&lt;br /&gt;
Пример - несложная функция, отображающая картинку из файла&lt;br /&gt;
&lt;br /&gt;
поддерживаются форматы&lt;br /&gt;
BMP, GIF, JPEG, PNG, TIFF, EMF&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;quot;atlconv.h&amp;quot;&lt;br /&gt;
#define HandleIsValid(H) (H!=(HANDLE)-1 &amp;amp;&amp;amp; H!=(HANDLE)0)&lt;br /&gt;
&lt;br /&gt;
//*pDestDC - CDC, на который предполагается вывод картинки&lt;br /&gt;
//pchzFilePath - путь к файлу&lt;br /&gt;
//pWid - (возвращает) ширина картинки&lt;br /&gt;
//pHig - (возвращает) высота картинки&lt;br /&gt;
bool DrawBitmapFromFile(CDC* pDestDC,const char* pchzFilePath,int *pWid=0,int *pHig=0)&lt;br /&gt;
{&lt;br /&gt;
	bool result=false;&lt;br /&gt;
&lt;br /&gt;
	if(pWid)*pWid=0;&lt;br /&gt;
	if(pHig)*pHig=0;&lt;br /&gt;
&lt;br /&gt;
	int Wid=0;&lt;br /&gt;
	int Hig=0;&lt;br /&gt;
&lt;br /&gt;
	IPicture* pPic=0;&lt;br /&gt;
	try&lt;br /&gt;
	{&lt;br /&gt;
		IPicture* ptmpPic=0;&lt;br /&gt;
		USES_CONVERSION;&lt;br /&gt;
		HRESULT hr;&lt;br /&gt;
&lt;br /&gt;
		CString txt=pchzFilePath;&lt;br /&gt;
		hr= ::OleLoadPicturePath(&lt;br /&gt;
			const_cast&amp;lt;LPOLESTR&amp;gt;(T2COLE(txt)),&lt;br /&gt;
			0,0,0,IID_IPicture,&lt;br /&gt;
			reinterpret_cast&amp;lt;void **&amp;gt;(&amp;amp;ptmpPic)&lt;br /&gt;
			);&lt;br /&gt;
&lt;br /&gt;
		if(hr==S_OK &amp;amp;&amp;amp; ptmpPic)&lt;br /&gt;
		{&lt;br /&gt;
			pPic=ptmpPic;&lt;br /&gt;
		}&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			throw 0;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		OLE_XPOS_HIMETRIC cxSrc;&lt;br /&gt;
		OLE_YPOS_HIMETRIC cySrc;&lt;br /&gt;
&lt;br /&gt;
		if(S_OK!=pPic-&amp;gt;get_Width(&amp;amp;cxSrc))throw 0;&lt;br /&gt;
		if(S_OK!=pPic-&amp;gt;get_Height(&amp;amp;cySrc))throw 0;&lt;br /&gt;
&lt;br /&gt;
		Wid=cxSrc/26;&lt;br /&gt;
		Hig=cySrc/26;&lt;br /&gt;
&lt;br /&gt;
		//рисуем&lt;br /&gt;
		if(S_OK !=pPic-&amp;gt;Render(pDestDC-&amp;gt;GetSafeHdc(),&lt;br /&gt;
			0,Hig,Wid,-Hig,0,0,cxSrc,cySrc,0))throw 0;&lt;br /&gt;
	}&lt;br /&gt;
	catch(...)&lt;br /&gt;
	{&lt;br /&gt;
		result=false;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if(pPic)&lt;br /&gt;
	{&lt;br /&gt;
		pPic-&amp;gt;Release();&lt;br /&gt;
		pPic=0;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	if(pWid)*pWid=Wid;&lt;br /&gt;
	if(pHig)*pHig=Hig;&lt;br /&gt;
&lt;br /&gt;
	return result;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===У меня модальное диалоговое окно, в нем поле редактирования мультилайновое, т.е. чтобы перейти на новую строку надо нажать ентер, но вызывается стандартный обработчик диалогового окна. Подскажите, что делать?===&lt;br /&gt;
Нужно в редакторе ресурсов поставить для CEdit окошка галочку&lt;br /&gt;
свойства WantReturn,&lt;br /&gt;
&lt;br /&gt;
или добавить ES_WANTRETURN при создании CEdit контрола динамически.&lt;br /&gt;
===Как выводят картинку-логотип(splash screen) при запуске программы? То есть, когда загружается программа на экран выводится картинка, потом она исчезает(загрузка программы закончена) и пользователь может приступать к работе ===&lt;br /&gt;
Для этого используется класс, производный от CDialog. Этот диалог после создания показывает себя на экран, выводя на себя рисунок. Также запускает таймер, по срабатывани которого диалог гасится. Создаётся диалог InitInstance приложения.&lt;br /&gt;
&lt;br /&gt;
В VC6++ также есть уже готовый компонент&lt;br /&gt;
Project-&amp;gt;Add To Project -&amp;gt; Components and Controls-&amp;gt;(в папке &amp;quot;Visual C++ Components&amp;quot; есть SplashScreen.)&lt;br /&gt;
&lt;br /&gt;
===Как сделать, чтобы при выпадении списка у ComboBox была не одна строка, а больше, вроде все свойства покрутил, не помогает Вместо выпадающего списка одна строка и скролл...===&lt;br /&gt;
В редакторе ресурсов надо щелкнуть в комбобоксе на треугольнике - появляется рамка для растягивания вниз - размер выпадающего списка.&lt;br /&gt;
===В VC++.net, что делать после того, как на форму установил ActiveX ListView, как объявить класс и переменную для этого элемента?===&lt;br /&gt;
Щёлкнуть правой кнопкой мыши на элементе, в меню - add variable или add class&lt;br /&gt;
&lt;br /&gt;
===Как вставить данные в буфер обмена (Clipboard) ? Как их оттуда вытащить ?===&lt;br /&gt;
&lt;br /&gt;
1) копирование в буфер обмена:&lt;br /&gt;
&lt;br /&gt;
  1.Готовим данные&lt;br /&gt;
    а.Выделяем память из кучи,  вызывая GlobalAlloc()&lt;br /&gt;
    б.Получаем указатель на выделенную память, вызывая GlobalLock()&lt;br /&gt;
    в.Заполняем данные&lt;br /&gt;
    г.Освобождаем указатель , вызывая GlobalUnlock();&lt;br /&gt;
&lt;br /&gt;
  2.Открываем буфер обмена , вызывая OpenClipboard();&lt;br /&gt;
  3.Очищаем буфер, вызывая EmptyClipboard();&lt;br /&gt;
  4.Вызываем SetClipboardData() один раз для каждого формата&lt;br /&gt;
      вставляемых данных (имеется в виду - если одни и те же&lt;br /&gt;
      данные представлены в разных форматах, и приложение&lt;br /&gt;
      может эти форматы создать)&lt;br /&gt;
  5.Закрываем буфер, вызывая CloseClipboard();&lt;br /&gt;
  6.ВЫЗЫВАТЬ GlobalFree() НЕ НУЖНО , в этом случае это&lt;br /&gt;
      предоставлено системе&lt;br /&gt;
&lt;br /&gt;
Скажем, хотим поместить в буфер обмена туда текст.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	//готовим данные&lt;br /&gt;
	//выделяем из кучи память для данных&lt;br /&gt;
	HANDLE hglbCopy = GlobalAlloc(GMEM_MOVEABLE,10);&lt;br /&gt;
	if(!hglbCopy)return;&lt;br /&gt;
&lt;br /&gt;
	//получаем указатель&lt;br /&gt;
	void* lpStr = GlobalLock(hglbCopy);&lt;br /&gt;
	if(!lpStr)return;&lt;br /&gt;
&lt;br /&gt;
	//заполняем данные&lt;br /&gt;
	strcpy((char*)lpStr,&amp;quot;my text&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	//освобождаем указатель&lt;br /&gt;
	GlobalUnlock(hglbCopy);&lt;br /&gt;
	lpStr=0;&lt;br /&gt;
&lt;br /&gt;
	//открываем буфер обмена&lt;br /&gt;
	OpenClipboard();&lt;br /&gt;
	//очищаем&lt;br /&gt;
	EmptyClipboard();&lt;br /&gt;
&lt;br /&gt;
	//текстовый формат&lt;br /&gt;
	SetClipboardData(CF_TEXT,hglbCopy);&lt;br /&gt;
&lt;br /&gt;
	//закрываем буфер&lt;br /&gt;
	CloseClipboard();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
2) извлечение из буфера обмена&lt;br /&gt;
&lt;br /&gt;
  1.Проверяем, что поддерживается нужный формат данных,&lt;br /&gt;
      вызывая IsClipboardFormatAvailable()&lt;br /&gt;
  2.Открываем буфер обмена , вызывая OpenClipboard();&lt;br /&gt;
  3.Достаём данные&lt;br /&gt;
   а.Получаем из буфера хендл требуемого формата,&lt;br /&gt;
      вызывая GetClipboardData()&lt;br /&gt;
    б.Получаем указатель на выделенную память, вызывая GlobalLock()&lt;br /&gt;
    в.Работаем с данными&lt;br /&gt;
    г.Освобождаем указатель , вызывая GlobalUnlock();&lt;br /&gt;
  4.Закрываем буфер, вызывая CloseClipboard();&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	//Проверяем, что поддерживается нужный формат данных,&lt;br /&gt;
	if(!IsClipboardFormatAvailable(CF_TEXT))return;&lt;br /&gt;
&lt;br /&gt;
	//открываем буфер обмена&lt;br /&gt;
	OpenClipboard();&lt;br /&gt;
&lt;br /&gt;
	//достаём данные&lt;br /&gt;
&lt;br /&gt;
	//текстовый формат&lt;br /&gt;
	HANDLE hglbCopy = GetClipboardData(CF_TEXT);&lt;br /&gt;
	if(!hglbCopy)return;&lt;br /&gt;
&lt;br /&gt;
	//получаем указатель&lt;br /&gt;
	void* lpStr = GlobalLock(hglbCopy);&lt;br /&gt;
	if(!lpStr)return;&lt;br /&gt;
&lt;br /&gt;
	//читаем данные&lt;br /&gt;
	char data[10];&lt;br /&gt;
	memmove(data,lpStr,sizeof(data));&lt;br /&gt;
&lt;br /&gt;
	//освобождаем указатель&lt;br /&gt;
	GlobalUnlock(hglbCopy);&lt;br /&gt;
	lpStr=0;&lt;br /&gt;
&lt;br /&gt;
	//закрываем буфер&lt;br /&gt;
	CloseClipboard();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как получить полный путь к экзешнику из самой программы ?===&lt;br /&gt;
В командную строку первым параметром система всегда передаёт заключённый в кавычки полный путь к файлу запущенной программы Достаём путь таким образом :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
BOOL CMyApp::InitInstance()&lt;br /&gt;
{&lt;br /&gt;
	//добыча полного имени экзешника&lt;br /&gt;
	CString csFullExeName;&lt;br /&gt;
	{&lt;br /&gt;
		CString csAppName=GetCommandLine();&lt;br /&gt;
		csAppName.Delete(0,1);&lt;br /&gt;
		csAppName.Replace('\&amp;quot;','\0');&lt;br /&gt;
		csFullExeName=(const char*)csAppName;&lt;br /&gt;
	}&lt;br /&gt;
	//теперь csFullExeName - содержит искомый путь&lt;br /&gt;
&lt;br /&gt;
	//...&lt;br /&gt;
	//...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Каким способом можно exe файл может заменить самого себя? То есть, моя программа обновляется, например, через Internet, и хочет обновить свой exe-файл. Но так как он в данный момент запущен - это будет, естественно, запрещено. Как это можно проще всего сделать?===&lt;br /&gt;
Один из способов - сделать копию экзешника и из него обновиться&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define def_exeNAMEup	&amp;quot;c:\\myprog_update.exe&amp;quot;&lt;br /&gt;
#define def_exeNAMEdnld	&amp;quot;c:\\myprog_downloaded.exe&amp;quot;&lt;br /&gt;
#define def_keyUdate	&amp;quot;/update&amp;quot;&lt;br /&gt;
&lt;br /&gt;
void CTESTFAQApp::UpdateItself()&lt;br /&gt;
{&lt;br /&gt;
	//добыча полного имени экзешника&lt;br /&gt;
	CString csFullExeName;&lt;br /&gt;
	{&lt;br /&gt;
		CString csAppName=GetCommandLine();&lt;br /&gt;
		csAppName.Delete(0,1);&lt;br /&gt;
		csAppName.Replace('\&amp;quot;','\0');&lt;br /&gt;
		csFullExeName=(const char*)csAppName;&lt;br /&gt;
	}&lt;br /&gt;
	//теперь csFullExeName - содержит искомый путь&lt;br /&gt;
&lt;br /&gt;
	//делаем копию экзешника с другим именем&lt;br /&gt;
	CopyFile(csFullExeName,def_exeNAMEup,0);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	//передаём в параметры нового процесса ключ и путь к текущему файлу&lt;br /&gt;
	CString csParams=def_keyUdate;&lt;br /&gt;
	csParams+=&amp;quot; &amp;quot;;&lt;br /&gt;
	csParams+=csFullExeName;&lt;br /&gt;
&lt;br /&gt;
	//запускаем копию&lt;br /&gt;
	STARTUPINFO si;&lt;br /&gt;
	PROCESS_INFORMATION pi;&lt;br /&gt;
	ZeroMemory(&amp;amp;si,sizeof(si));&lt;br /&gt;
	si.cb = sizeof(si);&lt;br /&gt;
	ZeroMemory(&amp;amp;pi,sizeof(pi));&lt;br /&gt;
	if(CreateProcess(def_exeNAMEup,def_keyUdate,0,0,0,0,0,0,&amp;amp;si,&amp;amp;pi))&lt;br /&gt;
	{&lt;br /&gt;
		//завершаем текущий процесс&lt;br /&gt;
		ExitFromMyApp();&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void CTESTFAQApp::ExitFromMyApp()&lt;br /&gt;
{&lt;br /&gt;
	exit(0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
BOOL CTESTFAQApp::InitInstance()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
	//смотрим, не запустили ли для апдейта?&lt;br /&gt;
&lt;br /&gt;
	CString txt;&lt;br /&gt;
	txt=m_lpCmdLine;&lt;br /&gt;
	if(txt.Find(def_keyUdate)==0)&lt;br /&gt;
	{&lt;br /&gt;
		//делаем айдейт&lt;br /&gt;
		txt.Replace(def_keyUdate,&amp;quot;&amp;quot;);&lt;br /&gt;
		txt.TrimLeft();&lt;br /&gt;
&lt;br /&gt;
		CString csFullExeName=txt;&lt;br /&gt;
&lt;br /&gt;
		//берём откуда то уже скачанный файл обновления&lt;br /&gt;
		//...&lt;br /&gt;
		CString csFull_Downloaded_ExeName=def_exeNAMEdnld;&lt;br /&gt;
&lt;br /&gt;
		//копируем файл (обновляем старый то есть)&lt;br /&gt;
		CopyFile(csFull_Downloaded_ExeName,csFullExeName,0);&lt;br /&gt;
&lt;br /&gt;
		//запускаем обновлённого мученника&lt;br /&gt;
		STARTUPINFO si;&lt;br /&gt;
		PROCESS_INFORMATION pi;&lt;br /&gt;
		ZeroMemory(&amp;amp;si,sizeof(si));&lt;br /&gt;
		si.cb = sizeof(si);&lt;br /&gt;
		ZeroMemory(&amp;amp;pi,sizeof(pi));&lt;br /&gt;
		if(CreateProcess(csFullExeName,0,0,0,0,0,0,0,&amp;amp;si,&amp;amp;pi))&lt;br /&gt;
&lt;br /&gt;
		ExitFromMyApp();&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
	//...&lt;br /&gt;
	//...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Есть строка символов (страничка из Инета) в кодировке utf-8 (строка char*). Как мне ее получить в формате String&lt;br /&gt;
или в char* в кодировке ANSI (cp 1251) ?===&lt;br /&gt;
Можно перевести строку из UTF8 в Unicode, затем из Unicode в 1251&lt;br /&gt;
&lt;br /&gt;
Ниже приведена структура, содержащая процедуры перекодирования,&lt;br /&gt;
а также процедуру с примером использования&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//описание структуры&lt;br /&gt;
struct coder&lt;br /&gt;
{&lt;br /&gt;
	//utf8-&amp;gt;unicode&lt;br /&gt;
	static wchar_t* utf8_to_unicode__dontForgetDeleteArr(const char *utf8_string)&lt;br /&gt;
	{&lt;br /&gt;
		wchar_t* pRes=0;&lt;br /&gt;
		int res_len=0;&lt;br /&gt;
&lt;br /&gt;
		//тест на возможность преобразования&lt;br /&gt;
		res_len=MultiByteToWideChar(CP_UTF8,0,utf8_string,-1,0,0);&lt;br /&gt;
		if(!res_len)return 0;&lt;br /&gt;
&lt;br /&gt;
		//выделяем память&lt;br /&gt;
		pRes = new wchar_t[res_len];&lt;br /&gt;
		if(!pRes)return 0;&lt;br /&gt;
&lt;br /&gt;
		//преобразование&lt;br /&gt;
		if(!MultiByteToWideChar(CP_UTF8,0,utf8_string,-1,pRes,res_len))&lt;br /&gt;
		{&lt;br /&gt;
			delete [] pRes;&lt;br /&gt;
			return 0;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		return pRes;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	//unicode-&amp;gt;1251&lt;br /&gt;
	static char * unicode_to_1251__dontForgetDeleteArr(const wchar_t *unicode_string)&lt;br /&gt;
	{&lt;br /&gt;
		char* pRes=0;&lt;br /&gt;
		int res_len=0;&lt;br /&gt;
&lt;br /&gt;
		//тест на возможность преобразования&lt;br /&gt;
		res_len = WideCharToMultiByte(1251,0,unicode_string,-1,0,0,0,0);&lt;br /&gt;
		if(!res_len)return 0;&lt;br /&gt;
&lt;br /&gt;
		//выделяем память&lt;br /&gt;
		pRes=new char[res_len];&lt;br /&gt;
		if(!pRes)return 0;&lt;br /&gt;
&lt;br /&gt;
		//преобразование&lt;br /&gt;
		if(!WideCharToMultiByte(1251,0,unicode_string,-1,pRes,res_len,0,0))&lt;br /&gt;
		{&lt;br /&gt;
			delete [] pRes;&lt;br /&gt;
			return 0;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		return pRes;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	//процедура с примером&lt;br /&gt;
	static void Example()&lt;br /&gt;
	{&lt;br /&gt;
		wchar_t* unicode_string=0;&lt;br /&gt;
		char* cp1251_string=0;&lt;br /&gt;
&lt;br /&gt;
		//исходный текст&lt;br /&gt;
		char utf8_string[] = &amp;quot;UTF-8 + СЂСѓСЃСЃРєРёР№ С‚РµРєСЃС‚&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
		for(;;)&lt;br /&gt;
		{&lt;br /&gt;
&lt;br /&gt;
			unicode_string=utf8_to_unicode__dontForgetDeleteArr(utf8_string);&lt;br /&gt;
			if(!unicode_string)&lt;br /&gt;
			{&lt;br /&gt;
				AfxMessageBox(&amp;quot;Не удалось конвертировать в unicode!&amp;quot;);&lt;br /&gt;
				break;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			cp1251_string = unicode_to_1251__dontForgetDeleteArr(unicode_string);&lt;br /&gt;
&lt;br /&gt;
			if(!cp1251_string)&lt;br /&gt;
			{&lt;br /&gt;
				AfxMessageBox(&amp;quot;Не удалось конвертировать из unicode!&amp;quot;);&lt;br /&gt;
				break;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			break;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		//cp1251_string - результат&lt;br /&gt;
		AfxMessageBox(cp1251_string);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
		//не забываем удалить массивы&lt;br /&gt;
		if(unicode_string)&lt;br /&gt;
		{&lt;br /&gt;
			delete [] unicode_string;&lt;br /&gt;
			unicode_string=0;&lt;br /&gt;
		}&lt;br /&gt;
		if(cp1251_string)&lt;br /&gt;
		{&lt;br /&gt;
			delete [] cp1251_string;&lt;br /&gt;
			cp1251_string=0;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
//вызов примера&lt;br /&gt;
coder::Example();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как организовать взаимодействие программы на VC.net с Access-овской базой данных?===&lt;br /&gt;
Проще всего подключить ADO компоненты и сделать все на них.&lt;br /&gt;
Компоненты  ADO (ADODC,DATAGRID и т.п.) это ActiveX.&lt;br /&gt;
В редакторе ресурсов, во всплывающем меню, есть Insert ActiveX Control -&amp;gt; открывается список всех компоент,&lt;br /&gt;
зарегистрированых на машине. Нужно найти компоненты (Это компоненты от MS и они помечены (OLEDB)) и вставить их в диалог. Для того что бы иметь возможность управлять ими, нужно импортировать обертки для них, это делается при помощи ClassWisard, там есть импорт-&amp;gt;класс-&amp;gt;указать файл с компоентой (OSX).&lt;br /&gt;
Появляется список всех классов, объявленых внутри.&lt;br /&gt;
Проставляем галочки, нажимаем ОК.&lt;br /&gt;
&lt;br /&gt;
[[Category:FAQ]]&lt;/div&gt;</summary>
		<author><name>Mczim</name></author>	</entry>

	<entry>
		<id>https://wiki.shelek.ru/index.php?title=FAQ:WinAPI,_VCPP_Part_3&amp;diff=420</id>
		<title>FAQ:WinAPI, VCPP Part 3</title>
		<link rel="alternate" type="text/html" href="https://wiki.shelek.ru/index.php?title=FAQ:WinAPI,_VCPP_Part_3&amp;diff=420"/>
				<updated>2008-08-14T18:59:48Z</updated>
		
		<summary type="html">&lt;p&gt;Mczim: таймет &amp;gt; таймер&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Имеется приложение на основе CRichEditView. Как узнать, что пользователь меняет текст?===&lt;br /&gt;
Добавить обработчик сообщения EN_CHANGE. Сообщение генерируется CRichEditView каждый раз, когда пользователь изменяет текст в окне CRichEditView&lt;br /&gt;
===Чем метод CArray::GetSize отличается от метода CArray::GetCount?===&lt;br /&gt;
Абсолютно ничем. (Скорее всего, были предыдущие библиотеки, в которых функции, одинаковые по смыслу, имели разные имена. Поэтому в целях совместимости оставили оба)&lt;br /&gt;
===Как загрузить строку из ресурса?===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CString m_Temp;&lt;br /&gt;
m_Temp.LoadString(ID_MYSTRING);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как поменять иконку у элемента (item) в CListCtrl?===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//заполняем структуру LVITEM&lt;br /&gt;
LVITEM lvItem;&lt;br /&gt;
memset(&amp;amp;lvItem,0,sizeof(lvItem));&lt;br /&gt;
	&lt;br /&gt;
lvItem.mask = LVIF_IMAGE;//меняться будет картинка&lt;br /&gt;
lvItem.iItem = ...;// индекс элемента списка (Zero-based)&lt;br /&gt;
lvItem.iSubItem = 0;&lt;br /&gt;
lvItem.iImage = ...; //индекс иконки (из списка контрола)&lt;br /&gt;
	&lt;br /&gt;
pList-&amp;gt;SetItem(&amp;amp; lvItem);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Имеется класс Class1, содержащий мембер типа указатель на Class2. В Class2 также имеется указатель на Class1. Компилятор выдаёт ошибку. Что надо делать?===&lt;br /&gt;
Предварительно объявляем класс Class2. Тогда компилятору будет известно, что описание класса Class2 будет встречено дальше, и станет возможным объявление указателей на класс до описания самого класса.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Class2;//предопределение&lt;br /&gt;
	&lt;br /&gt;
Class1&lt;br /&gt;
{&lt;br /&gt;
	Class2* p;&lt;br /&gt;
};&lt;br /&gt;
	&lt;br /&gt;
Class2&lt;br /&gt;
{&lt;br /&gt;
	Class1* p;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как переключить раскладку в другом (то есть в активном) процессе?===&lt;br /&gt;
Использовать функции:&lt;br /&gt;
   GetKeyboardLayout - определить текущую раскладку&lt;br /&gt;
   LoadKeyboardLayout - загрузить новую раскладку&lt;br /&gt;
&lt;br /&gt;
см.также&lt;br /&gt;
   VerLanguageName - получить строку с описанием языка&lt;br /&gt;
&lt;br /&gt;
(подробности - в MSDN)&lt;br /&gt;
===Как получить хендл контрола Edit зная его ID?===&lt;br /&gt;
Пусть контрол лежит на окне CMyWnd&lt;br /&gt;
Тогда:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void CMyWnd::некая_процедура()&lt;br /&gt;
{&lt;br /&gt;
	//для MFC&lt;br /&gt;
	CEdit* ed=(CEdit* ) GetDlgItem(ID_EDIT1);&lt;br /&gt;
	HWND hwnd=ed-&amp;gt;GetSafeHwnd();&lt;br /&gt;
	...&lt;br /&gt;
	&lt;br /&gt;
	//для Win32 API&lt;br /&gt;
	HWND hwnd=GetDlgItem(m_hWnd,ID_EDIT1);&lt;br /&gt;
	...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Как из дочернего окна закрыть приложение?===&lt;br /&gt;
Нужно послать родительскому окну (*pParent) сообщение WM_CLOSE:&lt;br /&gt;
 pParent-&amp;gt;PostMessage(WM_CLOSE);//MFC&lt;br /&gt;
или&lt;br /&gt;
 ::PostMessage(pParent-&amp;gt;m_hWnd,WM_CLOSE,(WPARAM)0,(LPARAM)0);//API&lt;br /&gt;
===Как корректно перевести BSTR в CString и наоборот?===&lt;br /&gt;
Нужно просто присвоить переменной типа CString переменную типа BSTR.&lt;br /&gt;
Оператор = класса CString сам всё переведёт.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//указатель на будущий буфер с BSTR.&lt;br /&gt;
//	(По сути, BSTR определён как &lt;br /&gt;
//	typedef WCHAR* BSTR;&lt;br /&gt;
//	то есть указатель на 16-битный символ юникод)&lt;br /&gt;
	&lt;br /&gt;
BSTR bstrHE=0;&lt;br /&gt;
	&lt;br /&gt;
CString Str=&amp;quot;мой текст&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
//Выделить память и загрузить адрес блока в bstrHE&lt;br /&gt;
bstrHE=Str.AllocSysString();&lt;br /&gt;
	&lt;br /&gt;
//...	&lt;br /&gt;
//тут работаем с bstrHE[]&lt;br /&gt;
//...&lt;br /&gt;
	&lt;br /&gt;
//освобождаем память&lt;br /&gt;
SysFreeString(bstrHE);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Как получить доступ к графическим ресурсам элементов текущей темы оформления Windows?===&lt;br /&gt;
Использовать функции&lt;br /&gt;
&lt;br /&gt;
OpenThemeData()&lt;br /&gt;
DrawThemeBackground()&lt;br /&gt;
DrawFrameControl()&lt;br /&gt;
CloseThemeData().&lt;br /&gt;
&lt;br /&gt;
(подробности - в MSDN)&lt;br /&gt;
===Имеется класс , производный от CDialog. Когда диалог в фокусе, нажатие на Enter или Esc приводит к закрытию диалога. Как это запретить?===&lt;br /&gt;
При нажатии Enter происходит выполнение команды IDOK,&lt;br /&gt;
при нажатии Esc - IDCANCEL.&lt;br /&gt;
Нужно переопределить в классе виртуальные функции OnOk() и OnCancel(),&lt;br /&gt;
которые соответственно вызываются для этих команд. При помощи&lt;br /&gt;
визарда эти функции добавить можно так: Положить на диалог две кнопки&lt;br /&gt;
с идентификаторами IDOK и IDCANCEL (при создании нового диалога они там&lt;br /&gt;
есть сразу), затем двойной клик по кнопке добавляет соответствующий&lt;br /&gt;
обработчик. В обработчиках надо удалить вызовы СDialog::OnOK() и&lt;br /&gt;
CDialog::OnCancel(), тогда диалог закрываться не будет.&lt;br /&gt;
Однако тогда диалог станет невозможно закрыть кнопкой с крестиком  :)&lt;br /&gt;
&lt;br /&gt;
Лечить так: добавить обработчик сообщения WM_CLOSE - OnClose(), и в нём&lt;br /&gt;
сделать вызов OnOk() или OnCancel() :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void CPlayersPropsDialog::OnClose() &lt;br /&gt;
{&lt;br /&gt;
	CDialog::OnClose();&lt;br /&gt;
	CDialog::OnCancel();//добавлено&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===VC++6. Я написал простейший макрос, а компилятор на него ругается. Ума не приложу, что за глюк?===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	#define my_macr(x,y,z) \&lt;br /&gt;
		z=\&lt;br /&gt;
		(x+y)*\&lt;br /&gt;
		(x-y)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Скорее всего после одного из символов соединения строк &amp;quot;\&amp;quot; имеется&lt;br /&gt;
пробел или табуляция. Их надо удалить. Можно найти их &amp;quot;наощупь&amp;quot;, а&lt;br /&gt;
можно включить показ непечатных символов в студии. Найти эту команду&lt;br /&gt;
можно так:&lt;br /&gt;
Tools-&amp;gt;Customize...-&amp;gt;вкладка Commands. В окошке Category выбрать&lt;br /&gt;
&amp;quot;Edit&amp;quot;, и среди кнопок справа найти кнопку, на которой написано &amp;quot;a.b&amp;quot;&lt;br /&gt;
Эту кнопку надо перетащить на одну из панелей инструментов студии.&lt;br /&gt;
&lt;br /&gt;
===Как получить список всех процесов, включая idle?===&lt;br /&gt;
Использовать функции&lt;br /&gt;
Process32First()&lt;br /&gt;
Precess32Next()&lt;br /&gt;
&lt;br /&gt;
===Как программно установить переменные окружения?===&lt;br /&gt;
Чтобы добавить или изменить их программно, необходимо воспользоваться&lt;br /&gt;
ключом реестра HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\&lt;br /&gt;
Session Manager\Environment, а затем отправить широковещательное&lt;br /&gt;
сообщение WM_SETTINGCHANGE. Это позволит приложениям узнать об&lt;br /&gt;
изменениях:&lt;br /&gt;
&lt;br /&gt;
::SendMessage(HWND_BROADCAST,WM_SETTINGCHANGE,0,0);&lt;br /&gt;
===Как сделать, чтобы у окна был черный фон?===&lt;br /&gt;
переопределить обработчик сообщения WM_CTLCOLOR - OnCtlColor() :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CBrush br(RGB(0,0,0));&lt;br /&gt;
	&lt;br /&gt;
HBRUSH CMyDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) &lt;br /&gt;
{&lt;br /&gt;
	HBRUSH hbr = CMyDlg::OnCtlColor(pDC, pWnd, nCtlColor);&lt;br /&gt;
	&lt;br /&gt;
	//фон диалога (или вьюшки)&lt;br /&gt;
	if(nCtlColor==CTLCOLOR_DLG)&lt;br /&gt;
	{&lt;br /&gt;
		return (HBRUSH)br;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	//фон статиков (если нужно)&lt;br /&gt;
	if(nCtlColor==CTLCOLOR_STATIC)&lt;br /&gt;
	{&lt;br /&gt;
		//делаем фон текста статика прозрачным&lt;br /&gt;
		pDC-&amp;gt;SetBkMode(TRANSPARENT);&lt;br /&gt;
		return (HBRUSH)br;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	return hbr;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Почему на моем компьютере экзешник, созданный в MFC запускается, а на других компьютерах - нет? Требует какую-то  dll-ку.===&lt;br /&gt;
Нужно выбирать режим Release :&lt;br /&gt;
&lt;br /&gt;
Menu-&amp;gt;Build-&amp;gt;Configurations...-&amp;gt;Release,&lt;br /&gt;
&lt;br /&gt;
и экзешник, соответственно, брать из папки Release проекта&lt;br /&gt;
===Как в диалог добавить меню?===&lt;br /&gt;
Надо сделать в ресурсах меню, затем вставить в диалог:&lt;br /&gt;
&lt;br /&gt;
открыть в редакторе диалог, в свойствах (во вкладке General, окошко Menu) указать идентивикатор ресурса меню.&lt;br /&gt;
При помощи визарда добавить для меню обработчики OnCommand() и OnUpdateСommand().&lt;br /&gt;
===Я добавил визардом меню в диалог. Добавил обработчики для пунктов меню. Пункты работают, но OnUpdate для пунктов не вызывается - то есть не получается ни затенить, ни чек поставить. Что делать?===&lt;br /&gt;
В диалоге у меню апдейта не происходит сам, в отличие от мейнфрейма.&lt;br /&gt;
Для этого нужно сделать самим апдейт в обработчике сообщения WM_KICKIDLE.&lt;br /&gt;
Визардом обработчик не добавляется, поэтому можно переопределить виртуальную DefWindowProc() и там обработать:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;afxpriv.h&amp;gt;	//этот файл надо включить, там определёна WM_KICKIDLE&lt;br /&gt;
&lt;br /&gt;
LRESULT CMyDialog::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam) &lt;br /&gt;
{&lt;br /&gt;
	if(message==WM_KICKIDLE)&lt;br /&gt;
	{&lt;br /&gt;
		//делаем апдейт для всех пунктов меню&lt;br /&gt;
		CMenu* pMainMenu=GetMenu();&lt;br /&gt;
		if(pMainMenu)&lt;br /&gt;
		{&lt;br /&gt;
			CCmdUI cmdUI;&lt;br /&gt;
			for (UINT n=0; n &amp;lt; pMainMenu-&amp;gt;GetMenuItemCount(); ++n)&lt;br /&gt;
			{&lt;br /&gt;
				CMenu* pSubMenu = pMainMenu-&amp;gt;GetSubMenu(n);&lt;br /&gt;
				if(!pSubMenu)continue;&lt;br /&gt;
	&lt;br /&gt;
				cmdUI.m_nIndexMax = pSubMenu-&amp;gt;GetMenuItemCount();&lt;br /&gt;
				for (UINT i = 0; i &amp;lt; cmdUI.m_nIndexMax;++i)&lt;br /&gt;
				{&lt;br /&gt;
					cmdUI.m_nIndex = i;&lt;br /&gt;
					cmdUI.m_nID = pSubMenu-&amp;gt;GetMenuItemID(i);&lt;br /&gt;
					cmdUI.m_pMenu = pSubMenu;&lt;br /&gt;
					cmdUI.DoUpdate(this, FALSE);&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	return CDialog::DefWindowProc(message, wParam, lParam);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Как на Visual C++ 6.0 в Главном окне отключить системное меню (в левом верхнем углу) и кнопки(в правом верхнем углу)?===&lt;br /&gt;
При создании окна нужно убрать стиль WS_SYSMENU&lt;br /&gt;
(теперь пользователь корректно может закрыть окно только Alt+F4,&lt;br /&gt;
ну или если вы предоставите ему дополнительную возможность сделать это)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пример 1. (для SDI, MDI)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//этот обработчик уже добавлен визардом&lt;br /&gt;
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT&amp;amp; cs)&lt;br /&gt;
{&lt;br /&gt;
	if( !CFrameWnd::PreCreateWindow(cs) )&lt;br /&gt;
		return FALSE;&lt;br /&gt;
	// TODO: Modify the Window class or styles here by modifying&lt;br /&gt;
	//  the CREATESTRUCT cs&lt;br /&gt;
&lt;br /&gt;
	///////////////////////////////&lt;br /&gt;
	//добавленная часть&lt;br /&gt;
	{&lt;br /&gt;
		//убираем стиль&lt;br /&gt;
		cs.style&amp;amp;=~WS_SYSMENU;&lt;br /&gt;
	}&lt;br /&gt;
	///////////////////////////////&lt;br /&gt;
&lt;br /&gt;
	return TRUE;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Пример 2. (для диалога)&lt;br /&gt;
Если диалог описан в ресурсах, то в свойствах диалога убрать галочки&lt;br /&gt;
  &amp;quot;System menu&amp;quot;&lt;br /&gt;
  &amp;quot;Minimize box&amp;quot;&lt;br /&gt;
  &amp;quot;Maximize box&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===Хочу сделать так, чтобы пользователь не мог нажать на кнопку, пока программа не разрешит.===&lt;br /&gt;
Нужно применить метод класса CWnd::EnableWindow(...) для кнопки.&lt;br /&gt;
Значение параметра 0 делает кнопку неактивной, 1 - делает активной.&lt;br /&gt;
(кстате, не только для кнопки можно, а для любого класса, производного&lt;br /&gt;
от класса CWnd)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пусть имеется некий диалог, на нём лежит кнопка c ID == IDC_1.&lt;br /&gt;
в любом месте кода диалога (кроме конструктора и деструктора , хотя, если&lt;br /&gt;
проверить наличие валидного хендла диалога, как в примере, то ничего&lt;br /&gt;
страшного не будет и там)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//делаем кнопку неактивной&lt;br /&gt;
if(m_hWnd)&lt;br /&gt;
{&lt;br /&gt;
	CWnd* pw=0;&lt;br /&gt;
	pw=GetDlgItem(IDC_1);&lt;br /&gt;
	if(pw)pw-&amp;gt;EnableWindow(0);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Что означают сообщения, которые студия выводит при компиляции, вроде таких : Loaded 'C:\WINDOWS\SYSTEM\WSOCK32.DLL', no matching symbolic information found. ===&lt;br /&gt;
Это строка говорит о том, что студия не смогла найти отладочные&lt;br /&gt;
символы для WSOCK32.DLL. В этом нет ничего страшного, просто при наличии&lt;br /&gt;
отладочных символов в процессе отладки можно получить доступ к именам&lt;br /&gt;
функции из системных DLL. Например, вместо&lt;br /&gt;
 KERNEL32! 0x77E8B184() -&lt;br /&gt;
 увидим&lt;br /&gt;
 KERNEL32!CreateThread.&lt;br /&gt;
===Как обработать сообщения, которое приходит к некому контролу (скажем CEdit)?===&lt;br /&gt;
Нужно произвести от CEdit свой класс, и в виртуальной процедуре класса WindowProc перехватить нужные сообщения.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
virtual LRESULT WindowProc(&lt;br /&gt;
   UINT message,&lt;br /&gt;
   WPARAM wParam,&lt;br /&gt;
   LPARAM lParam &lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Пример. Полностью выключаем, скажем, обработку сообщения WM_CHAR&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	LRESULT CMyEdit::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) &lt;br /&gt;
	{&lt;br /&gt;
		switch(message)&lt;br /&gt;
		{&lt;br /&gt;
			case WM_CHAR:&lt;br /&gt;
			{&lt;br /&gt;
				return 0;&lt;br /&gt;
			}&lt;br /&gt;
			break;&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		return CEdit::WindowProc(message, wParam, lParam);&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Чтобы связать экземпляр класса с контролом на форме, добавьте визардом для&lt;br /&gt;
контрола переменную класса (выбрав не Value а Control).&lt;br /&gt;
&lt;br /&gt;
===Как настроить количество пробелов в табуляции?===&lt;br /&gt;
Tools-&amp;gt;Options-&amp;gt;Tabs-&amp;gt;Insert Spaces&lt;br /&gt;
(или  правой кнопкой мыши по тексту-&amp;gt; properties)&lt;br /&gt;
===Как автоматически расставить отступы?===&lt;br /&gt;
Выделить текст для форматирования, нажать Alt+F8&lt;br /&gt;
&lt;br /&gt;
Есть ещё программа Artistic Style, которая занимается&lt;br /&gt;
переформатированием кода&lt;br /&gt;
http://sourceforge.net/projects/astyle/&lt;br /&gt;
===Поиск границ блока===&lt;br /&gt;
&amp;quot;CTRL+ }&amp;quot; ищет парную фигурную скобку в тексте и переходит на неё&lt;br /&gt;
===Вертикальное выделение текста===&lt;br /&gt;
&amp;quot;Alt + выделение мышкой&amp;quot; - позволяет выделять вертикальные фрагменты текста&lt;br /&gt;
===Как узнать количество установленных в CListCtrl столбцов?===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CListCtrl* pL=...; //указатель на переменную-контрол&lt;br /&gt;
&lt;br /&gt;
int count=pL-&amp;gt;GetHeaderCtrl()-&amp;gt;GetItemCount();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Как получить иконку приложения?===&lt;br /&gt;
Если приложение запущено, то нужно найти его главное окно и&lt;br /&gt;
послать ему сообщение WM_GETICON.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//функция возвращант хендл иконки &lt;br /&gt;
LRESULT SendMessage(hWnd, WM_GETICON, wParam, 0);&lt;br /&gt;
&lt;br /&gt;
//hWnd == хендл окна приложения&lt;br /&gt;
//wParam == &lt;br /&gt;
//	1)==ICON_BIG - получить большую иконку&lt;br /&gt;
//	2)==ICON_SMALL - получить маленькую иконку&lt;br /&gt;
//	3)==ICON_SMALL2 - получить маленькую иконку, если она определена&lt;br /&gt;
//				в приложении. Если её нет, то маленькую иконку, &lt;br /&gt;
//				сгенерированную системой из большой иконки&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как в CString можно найти или вырезать часть строки?===&lt;br /&gt;
есть такие методы в CString:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//вырезает кусок строки&lt;br /&gt;
CString Mid(int nFirst) const;&lt;br /&gt;
CString Mid(int nFirst,  int nCount) const;&lt;br /&gt;
&lt;br /&gt;
//возвращает кусок строки (сначала или с конца)&lt;br /&gt;
CString Left(int nCount ) const;&lt;br /&gt;
CString Right(int nCount ) const;&lt;br /&gt;
&lt;br /&gt;
//возвращает начальный кусок строки, в котором есть только&lt;br /&gt;
//символы из набора,представленного в lpszCharSet&lt;br /&gt;
CString SpanIncluding(LPCTSTR lpszCharSet ) const;&lt;br /&gt;
&lt;br /&gt;
//возвращает начальный кусок строки, в котором нет&lt;br /&gt;
//символов из набора,представленного в lpszCharSet&lt;br /&gt;
CString SpanExcluding(LPCTSTR lpszCharSet ) const; &lt;br /&gt;
&lt;br /&gt;
//убирает &amp;quot;пробелоподобные&amp;quot; символы из самого начала строки&lt;br /&gt;
//(то есть - пробел, табуляцию (\t) , возврат каретки, перевод строки (/r/n))&lt;br /&gt;
void TrimLeft();&lt;br /&gt;
//убирает все повторы символа из самого начала строки&lt;br /&gt;
void TrimLeft(TCHAR chTarget );&lt;br /&gt;
//убирает из самого начала строки все символа из набора lpszTargets &lt;br /&gt;
void TrimLeft(LPCTSTR lpszTargets ); &lt;br /&gt;
&lt;br /&gt;
void TrimRight();&lt;br /&gt;
void TrimRight(TCHAR chTarget );&lt;br /&gt;
void TrimRight(LPCTSTR lpszTargets ); &lt;br /&gt;
&lt;br /&gt;
//поиск в строке&lt;br /&gt;
int Find( TCHAR ch ) const;&lt;br /&gt;
int Find( LPCTSTR lpszSub ) const;&lt;br /&gt;
int Find( TCHAR ch, int nStart ) const;&lt;br /&gt;
int Find( LPCTSTR pstr, int nStart ) const;&lt;br /&gt;
&lt;br /&gt;
//поиск, начиная с конца&lt;br /&gt;
int ReverseFind( TCHAR ch ) const;&lt;br /&gt;
&lt;br /&gt;
//поиск позиции первого символа, одного из набора,&lt;br /&gt;
// представленного в lpszCharSet&lt;br /&gt;
int FindOneOf( LPCTSTR lpszCharSet ) const;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Есть у меня CListBox и я в ходе выполнения программы добавляю в него строки. Но я не могу посмотреть что именно добавляется. Вывод результатов происходит в конце выполнения процедуры...===&lt;br /&gt;
Если нужно делать принудительную перерисовку окна во время&lt;br /&gt;
длительных вычислений, то нужно вызывать для окна, которое&lt;br /&gt;
надо перерисовать метод&lt;br /&gt;
  RedrawWindow()&lt;br /&gt;
с параметрами по умолчанию, или пару&lt;br /&gt;
  Invalidate(0);&lt;br /&gt;
  UpdateWindow();&lt;br /&gt;
Это приводит к пометке всего окна к перерисовке и отправлению&lt;br /&gt;
сообщения WM_PAINT в оконную процедуру в обход очереди&lt;br /&gt;
сообщений, вызывая немедленную перерисовку окна.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CWnd* pw=...;//окно, которое надо перерисовывать&lt;br /&gt;
&lt;br /&gt;
for(int i=0;i&amp;lt;10000)&lt;br /&gt;
{&lt;br /&gt;
	//меняется содержимое окна&lt;br /&gt;
	//...&lt;br /&gt;
&lt;br /&gt;
	//немедленная перерисовка&lt;br /&gt;
	pw-&amp;gt;Invalidate(0);&lt;br /&gt;
	pw-&amp;gt;UpdateWindow();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Я написал DLL, которую используют несколько приложений. Всё вроде работает, но когда происходит очередной вызов функции из DLL, почему то данные в функции обнуляются. С чем это связано?===&lt;br /&gt;
Переменные и массивы в DLL, содержимое которых должно использоваться несколькими процессами, должны объявляться статическими. Статическая переменная или массив инициализируются только один раз в момент загрузки DLL.&lt;br /&gt;
Пример:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DWORD calltest()&lt;br /&gt;
{&lt;br /&gt;
	//будет выполнено только при первом вызове&lt;br /&gt;
	static DWORD callcount=0;&lt;br /&gt;
	static DWORD str[1000]={0}; &lt;br /&gt;
&lt;br /&gt;
	//будет выполняться каждый раз&lt;br /&gt;
	return ++callcount;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Как открыть проекцию файла в память и как с ней работать?===&lt;br /&gt;
Создаем проекцию&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HANDLE CreateFileMapping(&lt;br /&gt;
  HANDLE hFile,	//хендл уже открытого файла&lt;br /&gt;
  LPSECURITY_ATTRIBUTES lpAttributes,&lt;br /&gt;
  DWORD flProtect,	//способ открытия проекции&lt;br /&gt;
  DWORD dwMaximumSizeHigh,	//размер файла (старшие 4 байта , обычно==0)&lt;br /&gt;
  DWORD dwMaximumSizeLow,	//размер файла (младшие 4 байта)&lt;br /&gt;
  LPCTSTR lpName&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Доступ к созданной проекции производится процедурой&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LPVOID MapViewOfFile(&lt;br /&gt;
  HANDLE hFileMappingObject, //хендл проекции&lt;br /&gt;
  DWORD dwDesiredAccess,	//способ работы с проекцией&lt;br /&gt;
  DWORD dwFileOffsetHigh,&lt;br /&gt;
  DWORD dwFileOffsetLow, //смещение от начала файла (младшие 4 байта)&lt;br /&gt;
  SIZE_T dwNumberOfBytesToMap //длина в байтах (если ==0 - то весь файл)&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
далее с файлом можно работать как с обычным массивом в памяти.&lt;br /&gt;
&lt;br /&gt;
После работы с проекцией, её надо освободить процедурой&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
BOOL UnmapViewOfFile(&lt;br /&gt;
  LPCVOID lpBaseAddress //адрес, который вернула процедура MapViewOfFile&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Пример.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HANDLE hMapFile=0;//для проекции&lt;br /&gt;
&lt;br /&gt;
HANDLE hFile=...;//хендл уже открытого файла&lt;br /&gt;
DWORD dwdFileLen=...;//размер открытого файла&lt;br /&gt;
&lt;br /&gt;
//создаём проекцию &amp;quot;только для чтения&amp;quot;&lt;br /&gt;
hMapFile=::CreateFileMapping(hFile,0,PAGE_READONLY,0,dwdFileLen,0);&lt;br /&gt;
&lt;br /&gt;
//хендл hFile можно закрыть уже здесь, в принципе,&lt;br /&gt;
//но мы сделаем это позже&lt;br /&gt;
&lt;br /&gt;
//получаем доступ к проекции (тоже только для чтения)&lt;br /&gt;
BYTE* pbyFile=(BYTE*)::MapViewOfFile(hMapFile,FILE_MAP_READ,0,0,0);&lt;br /&gt;
&lt;br /&gt;
///////////////////&lt;br /&gt;
//тут работаем с массивом pbyFile[dwdFileLen] как с обычным,&lt;br /&gt;
//только не забываем, что он открыт только для чтения&lt;br /&gt;
//...&lt;br /&gt;
//...&lt;br /&gt;
//...&lt;br /&gt;
///////////////////&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//отключаем файл данных от адресного пространства&lt;br /&gt;
UnmapViewOfFile(pbyFile);&lt;br /&gt;
&lt;br /&gt;
//освобождаем хендл проекции&lt;br /&gt;
CloseHandle(hMapFile)&lt;br /&gt;
&lt;br /&gt;
//освобождаем хендл открытого файла&lt;br /&gt;
CloseHandle(hFile);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Использую MFC Grid control 2.25, не получается отобразить картинку в ячейке. Как это делается?===&lt;br /&gt;
Нужно создать список изображений (CImageList), затем передать указатель на список в контрол. Поскольку контрол лишь копирует указатель, список должен создаваться динамически, либо быть членом класса, экземпляр которого существует всё время работы контрола.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 m_GridMarket&lt;br /&gt;
CImageList m_ImageList;&lt;br /&gt;
CGridCtrL m_Grid1&lt;br /&gt;
...&lt;br /&gt;
...&lt;br /&gt;
//неким образом создаётся список&lt;br /&gt;
m_ImageList.Create(...);&lt;br /&gt;
//...&lt;br /&gt;
&lt;br /&gt;
//вставляем в контрол&lt;br /&gt;
m_Grid1.SetImageList(&amp;amp;m_ImageList);&lt;br /&gt;
&lt;br /&gt;
//&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Как при помощи IPicture отобразить картинку из файла? ===&lt;br /&gt;
Пример - несложная функция, отображающая картинку из файла&lt;br /&gt;
&lt;br /&gt;
поддерживаются форматы&lt;br /&gt;
BMP, GIF, JPEG, PNG, TIFF, EMF&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;quot;atlconv.h&amp;quot;&lt;br /&gt;
#define HandleIsValid(H) (H!=(HANDLE)-1 &amp;amp;&amp;amp; H!=(HANDLE)0)&lt;br /&gt;
&lt;br /&gt;
//*pDestDC - CDC, на который предполагается вывод картинки&lt;br /&gt;
//pchzFilePath - путь к файлу&lt;br /&gt;
//pWid - (возвращает) ширина картинки&lt;br /&gt;
//pHig - (возвращает) высота картинки&lt;br /&gt;
bool DrawBitmapFromFile(CDC* pDestDC,const char* pchzFilePath,int *pWid=0,int *pHig=0)&lt;br /&gt;
{&lt;br /&gt;
	bool result=false;&lt;br /&gt;
&lt;br /&gt;
	if(pWid)*pWid=0;&lt;br /&gt;
	if(pHig)*pHig=0;&lt;br /&gt;
&lt;br /&gt;
	int Wid=0;&lt;br /&gt;
	int Hig=0;&lt;br /&gt;
&lt;br /&gt;
	IPicture* pPic=0;&lt;br /&gt;
	try&lt;br /&gt;
	{&lt;br /&gt;
		IPicture* ptmpPic=0;&lt;br /&gt;
		USES_CONVERSION;&lt;br /&gt;
		HRESULT hr;&lt;br /&gt;
&lt;br /&gt;
		CString txt=pchzFilePath;&lt;br /&gt;
		hr= ::OleLoadPicturePath(&lt;br /&gt;
			const_cast&amp;lt;LPOLESTR&amp;gt;(T2COLE(txt)),&lt;br /&gt;
			0,0,0,IID_IPicture,&lt;br /&gt;
			reinterpret_cast&amp;lt;void **&amp;gt;(&amp;amp;ptmpPic)&lt;br /&gt;
			);&lt;br /&gt;
&lt;br /&gt;
		if(hr==S_OK &amp;amp;&amp;amp; ptmpPic)&lt;br /&gt;
		{&lt;br /&gt;
			pPic=ptmpPic;&lt;br /&gt;
		}&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			throw 0;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		OLE_XPOS_HIMETRIC cxSrc;&lt;br /&gt;
		OLE_YPOS_HIMETRIC cySrc;&lt;br /&gt;
&lt;br /&gt;
		if(S_OK!=pPic-&amp;gt;get_Width(&amp;amp;cxSrc))throw 0;&lt;br /&gt;
		if(S_OK!=pPic-&amp;gt;get_Height(&amp;amp;cySrc))throw 0;&lt;br /&gt;
&lt;br /&gt;
		Wid=cxSrc/26;&lt;br /&gt;
		Hig=cySrc/26;&lt;br /&gt;
&lt;br /&gt;
		//рисуем&lt;br /&gt;
		if(S_OK !=pPic-&amp;gt;Render(pDestDC-&amp;gt;GetSafeHdc(),&lt;br /&gt;
			0,Hig,Wid,-Hig,0,0,cxSrc,cySrc,0))throw 0;&lt;br /&gt;
	}&lt;br /&gt;
	catch(...)&lt;br /&gt;
	{&lt;br /&gt;
		result=false;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if(pPic)&lt;br /&gt;
	{&lt;br /&gt;
		pPic-&amp;gt;Release();&lt;br /&gt;
		pPic=0;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	if(pWid)*pWid=Wid;&lt;br /&gt;
	if(pHig)*pHig=Hig;&lt;br /&gt;
&lt;br /&gt;
	return result;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===У меня модальное диалоговое окно, в нем поле редактирования мультилайновое, т.е. чтобы перейти на новую строку надо нажать ентер, но вызывается стандартный обработчик диалогового окна. Подскажите, что делать?===&lt;br /&gt;
Нужно в редакторе ресурсов поставить для CEdit окошка галочку&lt;br /&gt;
свойства WantReturn,&lt;br /&gt;
&lt;br /&gt;
или добавить ES_WANTRETURN при создании CEdit контрола динамически.&lt;br /&gt;
===Как выводят картинку-логотип(splash screen) при запуске программы? То есть, когда загружается программа на экран выводится картинка, потом она исчезает(загрузка программы закончена) и пользователь может приступать к работе ===&lt;br /&gt;
Для этого используется класс, производный от CDialog. Этот диалог после создания показывает себя на экран, выводя на себя рисунок. Также запускает таймер, по срабатывани которого диалог гасится. Создаётся диалог InitInstance приложения.&lt;br /&gt;
&lt;br /&gt;
В VC6++ также есть уже готовый компонент&lt;br /&gt;
Project-&amp;gt;Add To Project -&amp;gt; Components and Controls-&amp;gt;(в папке &amp;quot;Visual C++ Components&amp;quot; есть SplashScreen.)&lt;br /&gt;
&lt;br /&gt;
===Как сделать, чтобы при выпадении списка у ComboBox была не одна строка, а больше, вроде все свойства покрутил, не помогает Вместо выпадающего списка одна строка и скролл...===&lt;br /&gt;
В редакторе ресурсов надо щелкнуть в комбобоксе на треугольнике - появляется рамка для растягивания вниз - размер выпадающего списка.&lt;br /&gt;
===В VC++.net , что делать после того, как на форму установил ActiiveX ListView, как объявить класс и переменную для этого элемента?===&lt;br /&gt;
Щёлкнуть правой кнопкой мыши на элементе , в меню - add variable или add class&lt;br /&gt;
===Как вставить данные в буфер обмена (Clipboard) ? Как их оттуда вытащить ?===&lt;br /&gt;
&lt;br /&gt;
1) копирование в буфер обмена:&lt;br /&gt;
&lt;br /&gt;
  1.Готовим данные&lt;br /&gt;
    а.Выделяем память из кучи,  вызывая GlobalAlloc()&lt;br /&gt;
    б.Получаем указатель на выделенную память, вызывая GlobalLock()&lt;br /&gt;
    в.Заполняем данные&lt;br /&gt;
    г.Освобождаем указатель , вызывая GlobalUnlock();&lt;br /&gt;
&lt;br /&gt;
  2.Открываем буфер обмена , вызывая OpenClipboard();&lt;br /&gt;
  3.Очищаем буфер, вызывая EmptyClipboard();&lt;br /&gt;
  4.Вызываем SetClipboardData() один раз для каждого формата&lt;br /&gt;
      вставляемых данных (имеется в виду - если одни и те же&lt;br /&gt;
      данные представлены в разных форматах, и приложение&lt;br /&gt;
      может эти форматы создать)&lt;br /&gt;
  5.Закрываем буфер, вызывая CloseClipboard();&lt;br /&gt;
  6.ВЫЗЫВАТЬ GlobalFree() НЕ НУЖНО , в этом случае это&lt;br /&gt;
      предоставлено системе&lt;br /&gt;
&lt;br /&gt;
Скажем, хотим поместить в буфер обмена туда текст.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	//готовим данные&lt;br /&gt;
	//выделяем из кучи память для данных&lt;br /&gt;
	HANDLE hglbCopy = GlobalAlloc(GMEM_MOVEABLE,10);&lt;br /&gt;
	if(!hglbCopy)return;&lt;br /&gt;
&lt;br /&gt;
	//получаем указатель&lt;br /&gt;
	void* lpStr = GlobalLock(hglbCopy);&lt;br /&gt;
	if(!lpStr)return;&lt;br /&gt;
&lt;br /&gt;
	//заполняем данные&lt;br /&gt;
	strcpy((char*)lpStr,&amp;quot;my text&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	//освобождаем указатель&lt;br /&gt;
	GlobalUnlock(hglbCopy);&lt;br /&gt;
	lpStr=0;&lt;br /&gt;
&lt;br /&gt;
	//открываем буфер обмена&lt;br /&gt;
	OpenClipboard();&lt;br /&gt;
	//очищаем&lt;br /&gt;
	EmptyClipboard();&lt;br /&gt;
&lt;br /&gt;
	//текстовый формат&lt;br /&gt;
	SetClipboardData(CF_TEXT,hglbCopy);&lt;br /&gt;
&lt;br /&gt;
	//закрываем буфер&lt;br /&gt;
	CloseClipboard();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
2) извлечение из буфера обмена&lt;br /&gt;
&lt;br /&gt;
  1.Проверяем, что поддерживается нужный формат данных,&lt;br /&gt;
      вызывая IsClipboardFormatAvailable()&lt;br /&gt;
  2.Открываем буфер обмена , вызывая OpenClipboard();&lt;br /&gt;
  3.Достаём данные&lt;br /&gt;
   а.Получаем из буфера хендл требуемого формата,&lt;br /&gt;
      вызывая GetClipboardData()&lt;br /&gt;
    б.Получаем указатель на выделенную память, вызывая GlobalLock()&lt;br /&gt;
    в.Работаем с данными&lt;br /&gt;
    г.Освобождаем указатель , вызывая GlobalUnlock();&lt;br /&gt;
  4.Закрываем буфер, вызывая CloseClipboard();&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	//Проверяем, что поддерживается нужный формат данных,&lt;br /&gt;
	if(!IsClipboardFormatAvailable(CF_TEXT))return;&lt;br /&gt;
&lt;br /&gt;
	//открываем буфер обмена&lt;br /&gt;
	OpenClipboard();&lt;br /&gt;
&lt;br /&gt;
	//достаём данные&lt;br /&gt;
&lt;br /&gt;
	//текстовый формат&lt;br /&gt;
	HANDLE hglbCopy = GetClipboardData(CF_TEXT);&lt;br /&gt;
	if(!hglbCopy)return;&lt;br /&gt;
&lt;br /&gt;
	//получаем указатель&lt;br /&gt;
	void* lpStr = GlobalLock(hglbCopy);&lt;br /&gt;
	if(!lpStr)return;&lt;br /&gt;
&lt;br /&gt;
	//читаем данные&lt;br /&gt;
	char data[10];&lt;br /&gt;
	memmove(data,lpStr,sizeof(data));&lt;br /&gt;
&lt;br /&gt;
	//освобождаем указатель&lt;br /&gt;
	GlobalUnlock(hglbCopy);&lt;br /&gt;
	lpStr=0;&lt;br /&gt;
&lt;br /&gt;
	//закрываем буфер&lt;br /&gt;
	CloseClipboard();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как получить полный путь к экзешнику из самой программы ?===&lt;br /&gt;
В командную строку первым параметром система всегда передаёт заключённый в кавычки полный путь к файлу запущенной программы Достаём путь таким образом :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
BOOL CMyApp::InitInstance()&lt;br /&gt;
{&lt;br /&gt;
	//добыча полного имени экзешника&lt;br /&gt;
	CString csFullExeName;&lt;br /&gt;
	{&lt;br /&gt;
		CString csAppName=GetCommandLine();&lt;br /&gt;
		csAppName.Delete(0,1);&lt;br /&gt;
		csAppName.Replace('\&amp;quot;','\0');&lt;br /&gt;
		csFullExeName=(const char*)csAppName;&lt;br /&gt;
	}&lt;br /&gt;
	//теперь csFullExeName - содержит искомый путь&lt;br /&gt;
&lt;br /&gt;
	//...&lt;br /&gt;
	//...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Каким способом можно exe файл может заменить самого себя? То есть, моя программа обновляется, например, через Internet, и хочет обновить свой exe-файл. Но так как он в данный момент запущен - это будет, естественно, запрещено. Как это можно проще всего сделать?===&lt;br /&gt;
Один из способов - сделать копию экзешника и из него обновиться&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define def_exeNAMEup	&amp;quot;c:\\myprog_update.exe&amp;quot;&lt;br /&gt;
#define def_exeNAMEdnld	&amp;quot;c:\\myprog_downloaded.exe&amp;quot;&lt;br /&gt;
#define def_keyUdate	&amp;quot;/update&amp;quot;&lt;br /&gt;
&lt;br /&gt;
void CTESTFAQApp::UpdateItself()&lt;br /&gt;
{&lt;br /&gt;
	//добыча полного имени экзешника&lt;br /&gt;
	CString csFullExeName;&lt;br /&gt;
	{&lt;br /&gt;
		CString csAppName=GetCommandLine();&lt;br /&gt;
		csAppName.Delete(0,1);&lt;br /&gt;
		csAppName.Replace('\&amp;quot;','\0');&lt;br /&gt;
		csFullExeName=(const char*)csAppName;&lt;br /&gt;
	}&lt;br /&gt;
	//теперь csFullExeName - содержит искомый путь&lt;br /&gt;
&lt;br /&gt;
	//делаем копию экзешника с другим именем&lt;br /&gt;
	CopyFile(csFullExeName,def_exeNAMEup,0);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	//передаём в параметры нового процесса ключ и путь к текущему файлу&lt;br /&gt;
	CString csParams=def_keyUdate;&lt;br /&gt;
	csParams+=&amp;quot; &amp;quot;;&lt;br /&gt;
	csParams+=csFullExeName;&lt;br /&gt;
&lt;br /&gt;
	//запускаем копию&lt;br /&gt;
	STARTUPINFO si;&lt;br /&gt;
	PROCESS_INFORMATION pi;&lt;br /&gt;
	ZeroMemory(&amp;amp;si,sizeof(si));&lt;br /&gt;
	si.cb = sizeof(si);&lt;br /&gt;
	ZeroMemory(&amp;amp;pi,sizeof(pi));&lt;br /&gt;
	if(CreateProcess(def_exeNAMEup,def_keyUdate,0,0,0,0,0,0,&amp;amp;si,&amp;amp;pi))&lt;br /&gt;
	{&lt;br /&gt;
		//завершаем текущий процесс&lt;br /&gt;
		ExitFromMyApp();&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void CTESTFAQApp::ExitFromMyApp()&lt;br /&gt;
{&lt;br /&gt;
	exit(0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
BOOL CTESTFAQApp::InitInstance()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
	//смотрим, не запустили ли для апдейта?&lt;br /&gt;
&lt;br /&gt;
	CString txt;&lt;br /&gt;
	txt=m_lpCmdLine;&lt;br /&gt;
	if(txt.Find(def_keyUdate)==0)&lt;br /&gt;
	{&lt;br /&gt;
		//делаем айдейт&lt;br /&gt;
		txt.Replace(def_keyUdate,&amp;quot;&amp;quot;);&lt;br /&gt;
		txt.TrimLeft();&lt;br /&gt;
&lt;br /&gt;
		CString csFullExeName=txt;&lt;br /&gt;
&lt;br /&gt;
		//берём откуда то уже скачанный файл обновления&lt;br /&gt;
		//...&lt;br /&gt;
		CString csFull_Downloaded_ExeName=def_exeNAMEdnld;&lt;br /&gt;
&lt;br /&gt;
		//копируем файл (обновляем старый то есть)&lt;br /&gt;
		CopyFile(csFull_Downloaded_ExeName,csFullExeName,0);&lt;br /&gt;
&lt;br /&gt;
		//запускаем обновлённого мученника&lt;br /&gt;
		STARTUPINFO si;&lt;br /&gt;
		PROCESS_INFORMATION pi;&lt;br /&gt;
		ZeroMemory(&amp;amp;si,sizeof(si));&lt;br /&gt;
		si.cb = sizeof(si);&lt;br /&gt;
		ZeroMemory(&amp;amp;pi,sizeof(pi));&lt;br /&gt;
		if(CreateProcess(csFullExeName,0,0,0,0,0,0,0,&amp;amp;si,&amp;amp;pi))&lt;br /&gt;
&lt;br /&gt;
		ExitFromMyApp();&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
	//...&lt;br /&gt;
	//...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Есть строка символов (страничка из Инета) в кодировке utf-8 (строка char*). Как мне ее получить в формате String&lt;br /&gt;
или в char* в кодировке ANSI (cp 1251) ?===&lt;br /&gt;
Можно перевести строку из UTF8 в Unicode, затем из Unicode в 1251&lt;br /&gt;
&lt;br /&gt;
Ниже приведена структура, содержащая процедуры перекодирования,&lt;br /&gt;
а также процедуру с примером использования&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//описание структуры&lt;br /&gt;
struct coder&lt;br /&gt;
{&lt;br /&gt;
	//utf8-&amp;gt;unicode&lt;br /&gt;
	static wchar_t* utf8_to_unicode__dontForgetDeleteArr(const char *utf8_string)&lt;br /&gt;
	{&lt;br /&gt;
		wchar_t* pRes=0;&lt;br /&gt;
		int res_len=0;&lt;br /&gt;
&lt;br /&gt;
		//тест на возможность преобразования&lt;br /&gt;
		res_len=MultiByteToWideChar(CP_UTF8,0,utf8_string,-1,0,0);&lt;br /&gt;
		if(!res_len)return 0;&lt;br /&gt;
&lt;br /&gt;
		//выделяем память&lt;br /&gt;
		pRes = new wchar_t[res_len];&lt;br /&gt;
		if(!pRes)return 0;&lt;br /&gt;
&lt;br /&gt;
		//преобразование&lt;br /&gt;
		if(!MultiByteToWideChar(CP_UTF8,0,utf8_string,-1,pRes,res_len))&lt;br /&gt;
		{&lt;br /&gt;
			delete [] pRes;&lt;br /&gt;
			return 0;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		return pRes;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	//unicode-&amp;gt;1251&lt;br /&gt;
	static char * unicode_to_1251__dontForgetDeleteArr(const wchar_t *unicode_string)&lt;br /&gt;
	{&lt;br /&gt;
		char* pRes=0;&lt;br /&gt;
		int res_len=0;&lt;br /&gt;
&lt;br /&gt;
		//тест на возможность преобразования&lt;br /&gt;
		res_len = WideCharToMultiByte(1251,0,unicode_string,-1,0,0,0,0);&lt;br /&gt;
		if(!res_len)return 0;&lt;br /&gt;
&lt;br /&gt;
		//выделяем память&lt;br /&gt;
		pRes=new char[res_len];&lt;br /&gt;
		if(!pRes)return 0;&lt;br /&gt;
&lt;br /&gt;
		//преобразование&lt;br /&gt;
		if(!WideCharToMultiByte(1251,0,unicode_string,-1,pRes,res_len,0,0))&lt;br /&gt;
		{&lt;br /&gt;
			delete [] pRes;&lt;br /&gt;
			return 0;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		return pRes;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	//процедура с примером&lt;br /&gt;
	static void Example()&lt;br /&gt;
	{&lt;br /&gt;
		wchar_t* unicode_string=0;&lt;br /&gt;
		char* cp1251_string=0;&lt;br /&gt;
&lt;br /&gt;
		//исходный текст&lt;br /&gt;
		char utf8_string[] = &amp;quot;UTF-8 + СЂСѓСЃСЃРєРёР№ С‚РµРєСЃС‚&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
		for(;;)&lt;br /&gt;
		{&lt;br /&gt;
&lt;br /&gt;
			unicode_string=utf8_to_unicode__dontForgetDeleteArr(utf8_string);&lt;br /&gt;
			if(!unicode_string)&lt;br /&gt;
			{&lt;br /&gt;
				AfxMessageBox(&amp;quot;Не удалось конвертировать в unicode!&amp;quot;);&lt;br /&gt;
				break;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			cp1251_string = unicode_to_1251__dontForgetDeleteArr(unicode_string);&lt;br /&gt;
&lt;br /&gt;
			if(!cp1251_string)&lt;br /&gt;
			{&lt;br /&gt;
				AfxMessageBox(&amp;quot;Не удалось конвертировать из unicode!&amp;quot;);&lt;br /&gt;
				break;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			break;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		//cp1251_string - результат&lt;br /&gt;
		AfxMessageBox(cp1251_string);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
		//не забываем удалить массивы&lt;br /&gt;
		if(unicode_string)&lt;br /&gt;
		{&lt;br /&gt;
			delete [] unicode_string;&lt;br /&gt;
			unicode_string=0;&lt;br /&gt;
		}&lt;br /&gt;
		if(cp1251_string)&lt;br /&gt;
		{&lt;br /&gt;
			delete [] cp1251_string;&lt;br /&gt;
			cp1251_string=0;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
//вызов примера&lt;br /&gt;
coder::Example();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как организовать взаимодействие программы на VC.net с Access-овской базой данных?===&lt;br /&gt;
Проще всего подключить ADO компоненты и сделать все на них.&lt;br /&gt;
Компоненты  ADO (ADODC,DATAGRID и т.п.) это ActiveX.&lt;br /&gt;
В редакторе ресурсов, во всплывающем меню, есть Insert ActiveX Control -&amp;gt; открывается список всех компоент,&lt;br /&gt;
зарегистрированых на машине. Нужно найти компоненты (Это компоненты от MS и они помечены (OLEDB)) и вставить их в диалог. Для того что бы иметь возможность управлять ими, нужно импортировать обертки для них, это делается при помощи ClassWisard, там есть импорт-&amp;gt;класс-&amp;gt;указать файл с компоентой (OSX).&lt;br /&gt;
Появляется список всех классов, объявленых внутри.&lt;br /&gt;
Проставляем галочки, нажимаем ОК.&lt;br /&gt;
&lt;br /&gt;
[[Category:FAQ]]&lt;/div&gt;</summary>
		<author><name>Mczim</name></author>	</entry>

	<entry>
		<id>https://wiki.shelek.ru/index.php?title=FAQ:WinAPI,_VCPP_Part_3&amp;diff=419</id>
		<title>FAQ:WinAPI, VCPP Part 3</title>
		<link rel="alternate" type="text/html" href="https://wiki.shelek.ru/index.php?title=FAQ:WinAPI,_VCPP_Part_3&amp;diff=419"/>
				<updated>2008-08-14T18:57:53Z</updated>
		
		<summary type="html">&lt;p&gt;Mczim: пробел перед знаком вопроса в заголовке + пробел перед запятой тоже в заголовке&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Имеется приложение на основе CRichEditView. Как узнать, что пользователь меняет текст?===&lt;br /&gt;
Добавить обработчик сообщения EN_CHANGE. Сообщение генерируется CRichEditView каждый раз, когда пользователь изменяет текст в окне CRichEditView&lt;br /&gt;
===Чем метод CArray::GetSize отличается от метода CArray::GetCount?===&lt;br /&gt;
Абсолютно ничем. (Скорее всего, были предыдущие библиотеки, в которых функции, одинаковые по смыслу, имели разные имена. Поэтому в целях совместимости оставили оба)&lt;br /&gt;
===Как загрузить строку из ресурса?===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CString m_Temp;&lt;br /&gt;
m_Temp.LoadString(ID_MYSTRING);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как поменять иконку у элемента (item) в CListCtrl?===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//заполняем структуру LVITEM&lt;br /&gt;
LVITEM lvItem;&lt;br /&gt;
memset(&amp;amp;lvItem,0,sizeof(lvItem));&lt;br /&gt;
	&lt;br /&gt;
lvItem.mask = LVIF_IMAGE;//меняться будет картинка&lt;br /&gt;
lvItem.iItem = ...;// индекс элемента списка (Zero-based)&lt;br /&gt;
lvItem.iSubItem = 0;&lt;br /&gt;
lvItem.iImage = ...; //индекс иконки (из списка контрола)&lt;br /&gt;
	&lt;br /&gt;
pList-&amp;gt;SetItem(&amp;amp; lvItem);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Имеется класс Class1, содержащий мембер типа указатель на Class2. В Class2 также имеется указатель на Class1. Компилятор выдаёт ошибку. Что надо делать?===&lt;br /&gt;
Предварительно объявляем класс Class2. Тогда компилятору будет известно, что описание класса Class2 будет встречено дальше, и станет возможным объявление указателей на класс до описания самого класса.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Class2;//предопределение&lt;br /&gt;
	&lt;br /&gt;
Class1&lt;br /&gt;
{&lt;br /&gt;
	Class2* p;&lt;br /&gt;
};&lt;br /&gt;
	&lt;br /&gt;
Class2&lt;br /&gt;
{&lt;br /&gt;
	Class1* p;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как переключить раскладку в другом (то есть в активном) процессе?===&lt;br /&gt;
Использовать функции:&lt;br /&gt;
   GetKeyboardLayout - определить текущую раскладку&lt;br /&gt;
   LoadKeyboardLayout - загрузить новую раскладку&lt;br /&gt;
&lt;br /&gt;
см.также&lt;br /&gt;
   VerLanguageName - получить строку с описанием языка&lt;br /&gt;
&lt;br /&gt;
(подробности - в MSDN)&lt;br /&gt;
===Как получить хендл контрола Edit зная его ID?===&lt;br /&gt;
Пусть контрол лежит на окне CMyWnd&lt;br /&gt;
Тогда:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void CMyWnd::некая_процедура()&lt;br /&gt;
{&lt;br /&gt;
	//для MFC&lt;br /&gt;
	CEdit* ed=(CEdit* ) GetDlgItem(ID_EDIT1);&lt;br /&gt;
	HWND hwnd=ed-&amp;gt;GetSafeHwnd();&lt;br /&gt;
	...&lt;br /&gt;
	&lt;br /&gt;
	//для Win32 API&lt;br /&gt;
	HWND hwnd=GetDlgItem(m_hWnd,ID_EDIT1);&lt;br /&gt;
	...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Как из дочернего окна закрыть приложение?===&lt;br /&gt;
Нужно послать родительскому окну (*pParent) сообщение WM_CLOSE:&lt;br /&gt;
 pParent-&amp;gt;PostMessage(WM_CLOSE);//MFC&lt;br /&gt;
или&lt;br /&gt;
 ::PostMessage(pParent-&amp;gt;m_hWnd,WM_CLOSE,(WPARAM)0,(LPARAM)0);//API&lt;br /&gt;
===Как корректно перевести BSTR в CString и наоборот?===&lt;br /&gt;
Нужно просто присвоить переменной типа CString переменную типа BSTR.&lt;br /&gt;
Оператор = класса CString сам всё переведёт.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//указатель на будущий буфер с BSTR.&lt;br /&gt;
//	(По сути, BSTR определён как &lt;br /&gt;
//	typedef WCHAR* BSTR;&lt;br /&gt;
//	то есть указатель на 16-битный символ юникод)&lt;br /&gt;
	&lt;br /&gt;
BSTR bstrHE=0;&lt;br /&gt;
	&lt;br /&gt;
CString Str=&amp;quot;мой текст&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
//Выделить память и загрузить адрес блока в bstrHE&lt;br /&gt;
bstrHE=Str.AllocSysString();&lt;br /&gt;
	&lt;br /&gt;
//...	&lt;br /&gt;
//тут работаем с bstrHE[]&lt;br /&gt;
//...&lt;br /&gt;
	&lt;br /&gt;
//освобождаем память&lt;br /&gt;
SysFreeString(bstrHE);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Как получить доступ к графическим ресурсам элементов текущей темы оформления Windows?===&lt;br /&gt;
Использовать функции&lt;br /&gt;
&lt;br /&gt;
OpenThemeData()&lt;br /&gt;
DrawThemeBackground()&lt;br /&gt;
DrawFrameControl()&lt;br /&gt;
CloseThemeData().&lt;br /&gt;
&lt;br /&gt;
(подробности - в MSDN)&lt;br /&gt;
===Имеется класс , производный от CDialog. Когда диалог в фокусе, нажатие на Enter или Esc приводит к закрытию диалога. Как это запретить?===&lt;br /&gt;
При нажатии Enter происходит выполнение команды IDOK,&lt;br /&gt;
при нажатии Esc - IDCANCEL.&lt;br /&gt;
Нужно переопределить в классе виртуальные функции OnOk() и OnCancel(),&lt;br /&gt;
которые соответственно вызываются для этих команд. При помощи&lt;br /&gt;
визарда эти функции добавить можно так: Положить на диалог две кнопки&lt;br /&gt;
с идентификаторами IDOK и IDCANCEL (при создании нового диалога они там&lt;br /&gt;
есть сразу), затем двойной клик по кнопке добавляет соответствующий&lt;br /&gt;
обработчик. В обработчиках надо удалить вызовы СDialog::OnOK() и&lt;br /&gt;
CDialog::OnCancel(), тогда диалог закрываться не будет.&lt;br /&gt;
Однако тогда диалог станет невозможно закрыть кнопкой с крестиком  :)&lt;br /&gt;
&lt;br /&gt;
Лечить так: добавить обработчик сообщения WM_CLOSE - OnClose(), и в нём&lt;br /&gt;
сделать вызов OnOk() или OnCancel() :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void CPlayersPropsDialog::OnClose() &lt;br /&gt;
{&lt;br /&gt;
	CDialog::OnClose();&lt;br /&gt;
	CDialog::OnCancel();//добавлено&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===VC++6. Я написал простейший макрос, а компилятор на него ругается. Ума не приложу, что за глюк?===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	#define my_macr(x,y,z) \&lt;br /&gt;
		z=\&lt;br /&gt;
		(x+y)*\&lt;br /&gt;
		(x-y)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Скорее всего после одного из символов соединения строк &amp;quot;\&amp;quot; имеется&lt;br /&gt;
пробел или табуляция. Их надо удалить. Можно найти их &amp;quot;наощупь&amp;quot;, а&lt;br /&gt;
можно включить показ непечатных символов в студии. Найти эту команду&lt;br /&gt;
можно так:&lt;br /&gt;
Tools-&amp;gt;Customize...-&amp;gt;вкладка Commands. В окошке Category выбрать&lt;br /&gt;
&amp;quot;Edit&amp;quot;, и среди кнопок справа найти кнопку, на которой написано &amp;quot;a.b&amp;quot;&lt;br /&gt;
Эту кнопку надо перетащить на одну из панелей инструментов студии.&lt;br /&gt;
&lt;br /&gt;
===Как получить список всех процесов, включая idle?===&lt;br /&gt;
Использовать функции&lt;br /&gt;
Process32First()&lt;br /&gt;
Precess32Next()&lt;br /&gt;
&lt;br /&gt;
===Как программно установить переменные окружения?===&lt;br /&gt;
Чтобы добавить или изменить их программно, необходимо воспользоваться&lt;br /&gt;
ключом реестра HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\&lt;br /&gt;
Session Manager\Environment, а затем отправить широковещательное&lt;br /&gt;
сообщение WM_SETTINGCHANGE. Это позволит приложениям узнать об&lt;br /&gt;
изменениях:&lt;br /&gt;
&lt;br /&gt;
::SendMessage(HWND_BROADCAST,WM_SETTINGCHANGE,0,0);&lt;br /&gt;
===Как сделать, чтобы у окна был черный фон?===&lt;br /&gt;
переопределить обработчик сообщения WM_CTLCOLOR - OnCtlColor() :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CBrush br(RGB(0,0,0));&lt;br /&gt;
	&lt;br /&gt;
HBRUSH CMyDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) &lt;br /&gt;
{&lt;br /&gt;
	HBRUSH hbr = CMyDlg::OnCtlColor(pDC, pWnd, nCtlColor);&lt;br /&gt;
	&lt;br /&gt;
	//фон диалога (или вьюшки)&lt;br /&gt;
	if(nCtlColor==CTLCOLOR_DLG)&lt;br /&gt;
	{&lt;br /&gt;
		return (HBRUSH)br;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	//фон статиков (если нужно)&lt;br /&gt;
	if(nCtlColor==CTLCOLOR_STATIC)&lt;br /&gt;
	{&lt;br /&gt;
		//делаем фон текста статика прозрачным&lt;br /&gt;
		pDC-&amp;gt;SetBkMode(TRANSPARENT);&lt;br /&gt;
		return (HBRUSH)br;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	return hbr;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Почему на моем компьютере экзешник, созданный в MFC запускается, а на других компьютерах - нет? Требует какую-то  dll-ку.===&lt;br /&gt;
Нужно выбирать режим Release :&lt;br /&gt;
&lt;br /&gt;
Menu-&amp;gt;Build-&amp;gt;Configurations...-&amp;gt;Release,&lt;br /&gt;
&lt;br /&gt;
и экзешник, соответственно, брать из папки Release проекта&lt;br /&gt;
===Как в диалог добавить меню?===&lt;br /&gt;
Надо сделать в ресурсах меню, затем вставить в диалог:&lt;br /&gt;
&lt;br /&gt;
открыть в редакторе диалог, в свойствах (во вкладке General, окошко Menu) указать идентивикатор ресурса меню.&lt;br /&gt;
При помощи визарда добавить для меню обработчики OnCommand() и OnUpdateСommand().&lt;br /&gt;
===Я добавил визардом меню в диалог. Добавил обработчики для пунктов меню. Пункты работают, но OnUpdate для пунктов не вызывается - то есть не получается ни затенить, ни чек поставить. Что делать?===&lt;br /&gt;
В диалоге у меню апдейта не происходит сам, в отличие от мейнфрейма.&lt;br /&gt;
Для этого нужно сделать самим апдейт в обработчике сообщения WM_KICKIDLE.&lt;br /&gt;
Визардом обработчик не добавляется, поэтому можно переопределить виртуальную DefWindowProc() и там обработать:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;afxpriv.h&amp;gt;	//этот файл надо включить, там определёна WM_KICKIDLE&lt;br /&gt;
&lt;br /&gt;
LRESULT CMyDialog::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam) &lt;br /&gt;
{&lt;br /&gt;
	if(message==WM_KICKIDLE)&lt;br /&gt;
	{&lt;br /&gt;
		//делаем апдейт для всех пунктов меню&lt;br /&gt;
		CMenu* pMainMenu=GetMenu();&lt;br /&gt;
		if(pMainMenu)&lt;br /&gt;
		{&lt;br /&gt;
			CCmdUI cmdUI;&lt;br /&gt;
			for (UINT n=0; n &amp;lt; pMainMenu-&amp;gt;GetMenuItemCount(); ++n)&lt;br /&gt;
			{&lt;br /&gt;
				CMenu* pSubMenu = pMainMenu-&amp;gt;GetSubMenu(n);&lt;br /&gt;
				if(!pSubMenu)continue;&lt;br /&gt;
	&lt;br /&gt;
				cmdUI.m_nIndexMax = pSubMenu-&amp;gt;GetMenuItemCount();&lt;br /&gt;
				for (UINT i = 0; i &amp;lt; cmdUI.m_nIndexMax;++i)&lt;br /&gt;
				{&lt;br /&gt;
					cmdUI.m_nIndex = i;&lt;br /&gt;
					cmdUI.m_nID = pSubMenu-&amp;gt;GetMenuItemID(i);&lt;br /&gt;
					cmdUI.m_pMenu = pSubMenu;&lt;br /&gt;
					cmdUI.DoUpdate(this, FALSE);&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	return CDialog::DefWindowProc(message, wParam, lParam);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Как на Visual C++ 6.0 в Главном окне отключить системное меню (в левом верхнем углу) и кнопки(в правом верхнем углу)?===&lt;br /&gt;
При создании окна нужно убрать стиль WS_SYSMENU&lt;br /&gt;
(теперь пользователь корректно может закрыть окно только Alt+F4,&lt;br /&gt;
ну или если вы предоставите ему дополнительную возможность сделать это)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пример 1. (для SDI, MDI)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//этот обработчик уже добавлен визардом&lt;br /&gt;
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT&amp;amp; cs)&lt;br /&gt;
{&lt;br /&gt;
	if( !CFrameWnd::PreCreateWindow(cs) )&lt;br /&gt;
		return FALSE;&lt;br /&gt;
	// TODO: Modify the Window class or styles here by modifying&lt;br /&gt;
	//  the CREATESTRUCT cs&lt;br /&gt;
&lt;br /&gt;
	///////////////////////////////&lt;br /&gt;
	//добавленная часть&lt;br /&gt;
	{&lt;br /&gt;
		//убираем стиль&lt;br /&gt;
		cs.style&amp;amp;=~WS_SYSMENU;&lt;br /&gt;
	}&lt;br /&gt;
	///////////////////////////////&lt;br /&gt;
&lt;br /&gt;
	return TRUE;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Пример 2. (для диалога)&lt;br /&gt;
Если диалог описан в ресурсах, то в свойствах диалога убрать галочки&lt;br /&gt;
  &amp;quot;System menu&amp;quot;&lt;br /&gt;
  &amp;quot;Minimize box&amp;quot;&lt;br /&gt;
  &amp;quot;Maximize box&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===Хочу сделать так, чтобы пользователь не мог нажать на кнопку, пока программа не разрешит.===&lt;br /&gt;
Нужно применить метод класса CWnd::EnableWindow(...) для кнопки.&lt;br /&gt;
Значение параметра 0 делает кнопку неактивной, 1 - делает активной.&lt;br /&gt;
(кстате, не только для кнопки можно, а для любого класса, производного&lt;br /&gt;
от класса CWnd)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пусть имеется некий диалог, на нём лежит кнопка c ID == IDC_1.&lt;br /&gt;
в любом месте кода диалога (кроме конструктора и деструктора , хотя, если&lt;br /&gt;
проверить наличие валидного хендла диалога, как в примере, то ничего&lt;br /&gt;
страшного не будет и там)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//делаем кнопку неактивной&lt;br /&gt;
if(m_hWnd)&lt;br /&gt;
{&lt;br /&gt;
	CWnd* pw=0;&lt;br /&gt;
	pw=GetDlgItem(IDC_1);&lt;br /&gt;
	if(pw)pw-&amp;gt;EnableWindow(0);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Что означают сообщения, которые студия выводит при компиляции, вроде таких : Loaded 'C:\WINDOWS\SYSTEM\WSOCK32.DLL', no matching symbolic information found. ===&lt;br /&gt;
Это строка говорит о том, что студия не смогла найти отладочные&lt;br /&gt;
символы для WSOCK32.DLL. В этом нет ничего страшного, просто при наличии&lt;br /&gt;
отладочных символов в процессе отладки можно получить доступ к именам&lt;br /&gt;
функции из системных DLL. Например, вместо&lt;br /&gt;
 KERNEL32! 0x77E8B184() -&lt;br /&gt;
 увидим&lt;br /&gt;
 KERNEL32!CreateThread.&lt;br /&gt;
===Как обработать сообщения, которое приходит к некому контролу (скажем CEdit)?===&lt;br /&gt;
Нужно произвести от CEdit свой класс, и в виртуальной процедуре класса WindowProc перехватить нужные сообщения.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
virtual LRESULT WindowProc(&lt;br /&gt;
   UINT message,&lt;br /&gt;
   WPARAM wParam,&lt;br /&gt;
   LPARAM lParam &lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Пример. Полностью выключаем, скажем, обработку сообщения WM_CHAR&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	LRESULT CMyEdit::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) &lt;br /&gt;
	{&lt;br /&gt;
		switch(message)&lt;br /&gt;
		{&lt;br /&gt;
			case WM_CHAR:&lt;br /&gt;
			{&lt;br /&gt;
				return 0;&lt;br /&gt;
			}&lt;br /&gt;
			break;&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		return CEdit::WindowProc(message, wParam, lParam);&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Чтобы связать экземпляр класса с контролом на форме, добавьте визардом для&lt;br /&gt;
контрола переменную класса (выбрав не Value а Control).&lt;br /&gt;
&lt;br /&gt;
===Как настроить количество пробелов в табуляции?===&lt;br /&gt;
Tools-&amp;gt;Options-&amp;gt;Tabs-&amp;gt;Insert Spaces&lt;br /&gt;
(или  правой кнопкой мыши по тексту-&amp;gt; properties)&lt;br /&gt;
===Как автоматически расставить отступы?===&lt;br /&gt;
Выделить текст для форматирования, нажать Alt+F8&lt;br /&gt;
&lt;br /&gt;
Есть ещё программа Artistic Style, которая занимается&lt;br /&gt;
переформатированием кода&lt;br /&gt;
http://sourceforge.net/projects/astyle/&lt;br /&gt;
===Поиск границ блока===&lt;br /&gt;
&amp;quot;CTRL+ }&amp;quot; ищет парную фигурную скобку в тексте и переходит на неё&lt;br /&gt;
===Вертикальное выделение текста===&lt;br /&gt;
&amp;quot;Alt + выделение мышкой&amp;quot; - позволяет выделять вертикальные фрагменты текста&lt;br /&gt;
===Как узнать количество установленных в CListCtrl столбцов?===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CListCtrl* pL=...; //указатель на переменную-контрол&lt;br /&gt;
&lt;br /&gt;
int count=pL-&amp;gt;GetHeaderCtrl()-&amp;gt;GetItemCount();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Как получить иконку приложения?===&lt;br /&gt;
Если приложение запущено, то нужно найти его главное окно и&lt;br /&gt;
послать ему сообщение WM_GETICON.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//функция возвращант хендл иконки &lt;br /&gt;
LRESULT SendMessage(hWnd, WM_GETICON, wParam, 0);&lt;br /&gt;
&lt;br /&gt;
//hWnd == хендл окна приложения&lt;br /&gt;
//wParam == &lt;br /&gt;
//	1)==ICON_BIG - получить большую иконку&lt;br /&gt;
//	2)==ICON_SMALL - получить маленькую иконку&lt;br /&gt;
//	3)==ICON_SMALL2 - получить маленькую иконку, если она определена&lt;br /&gt;
//				в приложении. Если её нет, то маленькую иконку, &lt;br /&gt;
//				сгенерированную системой из большой иконки&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как в CString можно найти или вырезать часть строки?===&lt;br /&gt;
есть такие методы в CString:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//вырезает кусок строки&lt;br /&gt;
CString Mid(int nFirst) const;&lt;br /&gt;
CString Mid(int nFirst,  int nCount) const;&lt;br /&gt;
&lt;br /&gt;
//возвращает кусок строки (сначала или с конца)&lt;br /&gt;
CString Left(int nCount ) const;&lt;br /&gt;
CString Right(int nCount ) const;&lt;br /&gt;
&lt;br /&gt;
//возвращает начальный кусок строки, в котором есть только&lt;br /&gt;
//символы из набора,представленного в lpszCharSet&lt;br /&gt;
CString SpanIncluding(LPCTSTR lpszCharSet ) const;&lt;br /&gt;
&lt;br /&gt;
//возвращает начальный кусок строки, в котором нет&lt;br /&gt;
//символов из набора,представленного в lpszCharSet&lt;br /&gt;
CString SpanExcluding(LPCTSTR lpszCharSet ) const; &lt;br /&gt;
&lt;br /&gt;
//убирает &amp;quot;пробелоподобные&amp;quot; символы из самого начала строки&lt;br /&gt;
//(то есть - пробел, табуляцию (\t) , возврат каретки, перевод строки (/r/n))&lt;br /&gt;
void TrimLeft();&lt;br /&gt;
//убирает все повторы символа из самого начала строки&lt;br /&gt;
void TrimLeft(TCHAR chTarget );&lt;br /&gt;
//убирает из самого начала строки все символа из набора lpszTargets &lt;br /&gt;
void TrimLeft(LPCTSTR lpszTargets ); &lt;br /&gt;
&lt;br /&gt;
void TrimRight();&lt;br /&gt;
void TrimRight(TCHAR chTarget );&lt;br /&gt;
void TrimRight(LPCTSTR lpszTargets ); &lt;br /&gt;
&lt;br /&gt;
//поиск в строке&lt;br /&gt;
int Find( TCHAR ch ) const;&lt;br /&gt;
int Find( LPCTSTR lpszSub ) const;&lt;br /&gt;
int Find( TCHAR ch, int nStart ) const;&lt;br /&gt;
int Find( LPCTSTR pstr, int nStart ) const;&lt;br /&gt;
&lt;br /&gt;
//поиск, начиная с конца&lt;br /&gt;
int ReverseFind( TCHAR ch ) const;&lt;br /&gt;
&lt;br /&gt;
//поиск позиции первого символа, одного из набора,&lt;br /&gt;
// представленного в lpszCharSet&lt;br /&gt;
int FindOneOf( LPCTSTR lpszCharSet ) const;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Есть у меня CListBox и я в ходе выполнения программы добавляю в него строки. Но я не могу посмотреть что именно добавляется. Вывод результатов происходит в конце выполнения процедуры...===&lt;br /&gt;
Если нужно делать принудительную перерисовку окна во время&lt;br /&gt;
длительных вычислений, то нужно вызывать для окна, которое&lt;br /&gt;
надо перерисовать метод&lt;br /&gt;
  RedrawWindow()&lt;br /&gt;
с параметрами по умолчанию, или пару&lt;br /&gt;
  Invalidate(0);&lt;br /&gt;
  UpdateWindow();&lt;br /&gt;
Это приводит к пометке всего окна к перерисовке и отправлению&lt;br /&gt;
сообщения WM_PAINT в оконную процедуру в обход очереди&lt;br /&gt;
сообщений, вызывая немедленную перерисовку окна.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CWnd* pw=...;//окно, которое надо перерисовывать&lt;br /&gt;
&lt;br /&gt;
for(int i=0;i&amp;lt;10000)&lt;br /&gt;
{&lt;br /&gt;
	//меняется содержимое окна&lt;br /&gt;
	//...&lt;br /&gt;
&lt;br /&gt;
	//немедленная перерисовка&lt;br /&gt;
	pw-&amp;gt;Invalidate(0);&lt;br /&gt;
	pw-&amp;gt;UpdateWindow();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Я написал DLL, которую используют несколько приложений. Всё вроде работает, но когда происходит очередной вызов функции из DLL, почему то данные в функции обнуляются. С чем это связано?===&lt;br /&gt;
Переменные и массивы в DLL, содержимое которых должно использоваться несколькими процессами, должны объявляться статическими. Статическая переменная или массив инициализируются только один раз в момент загрузки DLL.&lt;br /&gt;
Пример:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DWORD calltest()&lt;br /&gt;
{&lt;br /&gt;
	//будет выполнено только при первом вызове&lt;br /&gt;
	static DWORD callcount=0;&lt;br /&gt;
	static DWORD str[1000]={0}; &lt;br /&gt;
&lt;br /&gt;
	//будет выполняться каждый раз&lt;br /&gt;
	return ++callcount;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Как открыть проекцию файла в память и как с ней работать?===&lt;br /&gt;
Создаем проекцию&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HANDLE CreateFileMapping(&lt;br /&gt;
  HANDLE hFile,	//хендл уже открытого файла&lt;br /&gt;
  LPSECURITY_ATTRIBUTES lpAttributes,&lt;br /&gt;
  DWORD flProtect,	//способ открытия проекции&lt;br /&gt;
  DWORD dwMaximumSizeHigh,	//размер файла (старшие 4 байта , обычно==0)&lt;br /&gt;
  DWORD dwMaximumSizeLow,	//размер файла (младшие 4 байта)&lt;br /&gt;
  LPCTSTR lpName&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Доступ к созданной проекции производится процедурой&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LPVOID MapViewOfFile(&lt;br /&gt;
  HANDLE hFileMappingObject, //хендл проекции&lt;br /&gt;
  DWORD dwDesiredAccess,	//способ работы с проекцией&lt;br /&gt;
  DWORD dwFileOffsetHigh,&lt;br /&gt;
  DWORD dwFileOffsetLow, //смещение от начала файла (младшие 4 байта)&lt;br /&gt;
  SIZE_T dwNumberOfBytesToMap //длина в байтах (если ==0 - то весь файл)&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
далее с файлом можно работать как с обычным массивом в памяти.&lt;br /&gt;
&lt;br /&gt;
После работы с проекцией, её надо освободить процедурой&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
BOOL UnmapViewOfFile(&lt;br /&gt;
  LPCVOID lpBaseAddress //адрес, который вернула процедура MapViewOfFile&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Пример.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HANDLE hMapFile=0;//для проекции&lt;br /&gt;
&lt;br /&gt;
HANDLE hFile=...;//хендл уже открытого файла&lt;br /&gt;
DWORD dwdFileLen=...;//размер открытого файла&lt;br /&gt;
&lt;br /&gt;
//создаём проекцию &amp;quot;только для чтения&amp;quot;&lt;br /&gt;
hMapFile=::CreateFileMapping(hFile,0,PAGE_READONLY,0,dwdFileLen,0);&lt;br /&gt;
&lt;br /&gt;
//хендл hFile можно закрыть уже здесь, в принципе,&lt;br /&gt;
//но мы сделаем это позже&lt;br /&gt;
&lt;br /&gt;
//получаем доступ к проекции (тоже только для чтения)&lt;br /&gt;
BYTE* pbyFile=(BYTE*)::MapViewOfFile(hMapFile,FILE_MAP_READ,0,0,0);&lt;br /&gt;
&lt;br /&gt;
///////////////////&lt;br /&gt;
//тут работаем с массивом pbyFile[dwdFileLen] как с обычным,&lt;br /&gt;
//только не забываем, что он открыт только для чтения&lt;br /&gt;
//...&lt;br /&gt;
//...&lt;br /&gt;
//...&lt;br /&gt;
///////////////////&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//отключаем файл данных от адресного пространства&lt;br /&gt;
UnmapViewOfFile(pbyFile);&lt;br /&gt;
&lt;br /&gt;
//освобождаем хендл проекции&lt;br /&gt;
CloseHandle(hMapFile)&lt;br /&gt;
&lt;br /&gt;
//освобождаем хендл открытого файла&lt;br /&gt;
CloseHandle(hFile);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Использую MFC Grid control 2.25, не получается отобразить картинку в ячейке. Как это делается?===&lt;br /&gt;
Нужно создать список изображений (CImageList), затем передать указатель на список в контрол. Поскольку контрол лишь копирует указатель, список должен создаваться динамически, либо быть членом класса, экземпляр которого существует всё время работы контрола.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 m_GridMarket&lt;br /&gt;
CImageList m_ImageList;&lt;br /&gt;
CGridCtrL m_Grid1&lt;br /&gt;
...&lt;br /&gt;
...&lt;br /&gt;
//неким образом создаётся список&lt;br /&gt;
m_ImageList.Create(...);&lt;br /&gt;
//...&lt;br /&gt;
&lt;br /&gt;
//вставляем в контрол&lt;br /&gt;
m_Grid1.SetImageList(&amp;amp;m_ImageList);&lt;br /&gt;
&lt;br /&gt;
//&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Как при помощи IPicture отобразить картинку из файла? ===&lt;br /&gt;
Пример - несложная функция, отображающая картинку из файла&lt;br /&gt;
&lt;br /&gt;
поддерживаются форматы&lt;br /&gt;
BMP, GIF, JPEG, PNG, TIFF, EMF&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;quot;atlconv.h&amp;quot;&lt;br /&gt;
#define HandleIsValid(H) (H!=(HANDLE)-1 &amp;amp;&amp;amp; H!=(HANDLE)0)&lt;br /&gt;
&lt;br /&gt;
//*pDestDC - CDC, на который предполагается вывод картинки&lt;br /&gt;
//pchzFilePath - путь к файлу&lt;br /&gt;
//pWid - (возвращает) ширина картинки&lt;br /&gt;
//pHig - (возвращает) высота картинки&lt;br /&gt;
bool DrawBitmapFromFile(CDC* pDestDC,const char* pchzFilePath,int *pWid=0,int *pHig=0)&lt;br /&gt;
{&lt;br /&gt;
	bool result=false;&lt;br /&gt;
&lt;br /&gt;
	if(pWid)*pWid=0;&lt;br /&gt;
	if(pHig)*pHig=0;&lt;br /&gt;
&lt;br /&gt;
	int Wid=0;&lt;br /&gt;
	int Hig=0;&lt;br /&gt;
&lt;br /&gt;
	IPicture* pPic=0;&lt;br /&gt;
	try&lt;br /&gt;
	{&lt;br /&gt;
		IPicture* ptmpPic=0;&lt;br /&gt;
		USES_CONVERSION;&lt;br /&gt;
		HRESULT hr;&lt;br /&gt;
&lt;br /&gt;
		CString txt=pchzFilePath;&lt;br /&gt;
		hr= ::OleLoadPicturePath(&lt;br /&gt;
			const_cast&amp;lt;LPOLESTR&amp;gt;(T2COLE(txt)),&lt;br /&gt;
			0,0,0,IID_IPicture,&lt;br /&gt;
			reinterpret_cast&amp;lt;void **&amp;gt;(&amp;amp;ptmpPic)&lt;br /&gt;
			);&lt;br /&gt;
&lt;br /&gt;
		if(hr==S_OK &amp;amp;&amp;amp; ptmpPic)&lt;br /&gt;
		{&lt;br /&gt;
			pPic=ptmpPic;&lt;br /&gt;
		}&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			throw 0;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		OLE_XPOS_HIMETRIC cxSrc;&lt;br /&gt;
		OLE_YPOS_HIMETRIC cySrc;&lt;br /&gt;
&lt;br /&gt;
		if(S_OK!=pPic-&amp;gt;get_Width(&amp;amp;cxSrc))throw 0;&lt;br /&gt;
		if(S_OK!=pPic-&amp;gt;get_Height(&amp;amp;cySrc))throw 0;&lt;br /&gt;
&lt;br /&gt;
		Wid=cxSrc/26;&lt;br /&gt;
		Hig=cySrc/26;&lt;br /&gt;
&lt;br /&gt;
		//рисуем&lt;br /&gt;
		if(S_OK !=pPic-&amp;gt;Render(pDestDC-&amp;gt;GetSafeHdc(),&lt;br /&gt;
			0,Hig,Wid,-Hig,0,0,cxSrc,cySrc,0))throw 0;&lt;br /&gt;
	}&lt;br /&gt;
	catch(...)&lt;br /&gt;
	{&lt;br /&gt;
		result=false;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if(pPic)&lt;br /&gt;
	{&lt;br /&gt;
		pPic-&amp;gt;Release();&lt;br /&gt;
		pPic=0;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	if(pWid)*pWid=Wid;&lt;br /&gt;
	if(pHig)*pHig=Hig;&lt;br /&gt;
&lt;br /&gt;
	return result;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===У меня модальное диалоговое окно, в нем поле редактирования мультилайновое, т.е. чтобы перейти на новую строку надо нажать ентер, но вызывается стандартный обработчик диалогового окна. Подскажите, что делать?===&lt;br /&gt;
Нужно в редакторе ресурсов поставить для CEdit окошка галочку&lt;br /&gt;
свойства WantReturn,&lt;br /&gt;
&lt;br /&gt;
или добавить ES_WANTRETURN при создании CEdit контрола динамически.&lt;br /&gt;
===Как выводят картинку-логотип(splash screen) при запуске программы? То есть, когда загружается программа на экран выводится картинка, потом она исчезает(загрузка программы закончена) и пользователь может приступать к работе ===&lt;br /&gt;
Для этого используется класс, производный от CDialog. Этот диалог после создания показывает себя на экран, выводя на себя рисунок. Также запускает таймет, по срабатывани которого диалог гасится. Создаётся диалог InitInstance приложения.&lt;br /&gt;
&lt;br /&gt;
В VC6++ также есть уже готовый компонент&lt;br /&gt;
Project-&amp;gt;Add To Project -&amp;gt; Components and Controls-&amp;gt;(в папке &amp;quot;Visual C++ Components&amp;quot; есть SplashScreen.)&lt;br /&gt;
===Как сделать, чтобы при выпадении списка у ComboBox была не одна строка, а больше, вроде все свойства покрутил, не помогает Вместо выпадающего списка одна строка и скролл...===&lt;br /&gt;
В редакторе ресурсов надо щелкнуть в комбобоксе на треугольнике - появляется рамка для растягивания вниз - размер выпадающего списка.&lt;br /&gt;
===В VC++.net , что делать после того, как на форму установил ActiiveX ListView, как объявить класс и переменную для этого элемента?===&lt;br /&gt;
Щёлкнуть правой кнопкой мыши на элементе , в меню - add variable или add class&lt;br /&gt;
===Как вставить данные в буфер обмена (Clipboard) ? Как их оттуда вытащить ?===&lt;br /&gt;
&lt;br /&gt;
1) копирование в буфер обмена:&lt;br /&gt;
&lt;br /&gt;
  1.Готовим данные&lt;br /&gt;
    а.Выделяем память из кучи,  вызывая GlobalAlloc()&lt;br /&gt;
    б.Получаем указатель на выделенную память, вызывая GlobalLock()&lt;br /&gt;
    в.Заполняем данные&lt;br /&gt;
    г.Освобождаем указатель , вызывая GlobalUnlock();&lt;br /&gt;
&lt;br /&gt;
  2.Открываем буфер обмена , вызывая OpenClipboard();&lt;br /&gt;
  3.Очищаем буфер, вызывая EmptyClipboard();&lt;br /&gt;
  4.Вызываем SetClipboardData() один раз для каждого формата&lt;br /&gt;
      вставляемых данных (имеется в виду - если одни и те же&lt;br /&gt;
      данные представлены в разных форматах, и приложение&lt;br /&gt;
      может эти форматы создать)&lt;br /&gt;
  5.Закрываем буфер, вызывая CloseClipboard();&lt;br /&gt;
  6.ВЫЗЫВАТЬ GlobalFree() НЕ НУЖНО , в этом случае это&lt;br /&gt;
      предоставлено системе&lt;br /&gt;
&lt;br /&gt;
Скажем, хотим поместить в буфер обмена туда текст.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	//готовим данные&lt;br /&gt;
	//выделяем из кучи память для данных&lt;br /&gt;
	HANDLE hglbCopy = GlobalAlloc(GMEM_MOVEABLE,10);&lt;br /&gt;
	if(!hglbCopy)return;&lt;br /&gt;
&lt;br /&gt;
	//получаем указатель&lt;br /&gt;
	void* lpStr = GlobalLock(hglbCopy);&lt;br /&gt;
	if(!lpStr)return;&lt;br /&gt;
&lt;br /&gt;
	//заполняем данные&lt;br /&gt;
	strcpy((char*)lpStr,&amp;quot;my text&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	//освобождаем указатель&lt;br /&gt;
	GlobalUnlock(hglbCopy);&lt;br /&gt;
	lpStr=0;&lt;br /&gt;
&lt;br /&gt;
	//открываем буфер обмена&lt;br /&gt;
	OpenClipboard();&lt;br /&gt;
	//очищаем&lt;br /&gt;
	EmptyClipboard();&lt;br /&gt;
&lt;br /&gt;
	//текстовый формат&lt;br /&gt;
	SetClipboardData(CF_TEXT,hglbCopy);&lt;br /&gt;
&lt;br /&gt;
	//закрываем буфер&lt;br /&gt;
	CloseClipboard();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
2) извлечение из буфера обмена&lt;br /&gt;
&lt;br /&gt;
  1.Проверяем, что поддерживается нужный формат данных,&lt;br /&gt;
      вызывая IsClipboardFormatAvailable()&lt;br /&gt;
  2.Открываем буфер обмена , вызывая OpenClipboard();&lt;br /&gt;
  3.Достаём данные&lt;br /&gt;
   а.Получаем из буфера хендл требуемого формата,&lt;br /&gt;
      вызывая GetClipboardData()&lt;br /&gt;
    б.Получаем указатель на выделенную память, вызывая GlobalLock()&lt;br /&gt;
    в.Работаем с данными&lt;br /&gt;
    г.Освобождаем указатель , вызывая GlobalUnlock();&lt;br /&gt;
  4.Закрываем буфер, вызывая CloseClipboard();&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	//Проверяем, что поддерживается нужный формат данных,&lt;br /&gt;
	if(!IsClipboardFormatAvailable(CF_TEXT))return;&lt;br /&gt;
&lt;br /&gt;
	//открываем буфер обмена&lt;br /&gt;
	OpenClipboard();&lt;br /&gt;
&lt;br /&gt;
	//достаём данные&lt;br /&gt;
&lt;br /&gt;
	//текстовый формат&lt;br /&gt;
	HANDLE hglbCopy = GetClipboardData(CF_TEXT);&lt;br /&gt;
	if(!hglbCopy)return;&lt;br /&gt;
&lt;br /&gt;
	//получаем указатель&lt;br /&gt;
	void* lpStr = GlobalLock(hglbCopy);&lt;br /&gt;
	if(!lpStr)return;&lt;br /&gt;
&lt;br /&gt;
	//читаем данные&lt;br /&gt;
	char data[10];&lt;br /&gt;
	memmove(data,lpStr,sizeof(data));&lt;br /&gt;
&lt;br /&gt;
	//освобождаем указатель&lt;br /&gt;
	GlobalUnlock(hglbCopy);&lt;br /&gt;
	lpStr=0;&lt;br /&gt;
&lt;br /&gt;
	//закрываем буфер&lt;br /&gt;
	CloseClipboard();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как получить полный путь к экзешнику из самой программы ?===&lt;br /&gt;
В командную строку первым параметром система всегда передаёт заключённый в кавычки полный путь к файлу запущенной программы Достаём путь таким образом :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
BOOL CMyApp::InitInstance()&lt;br /&gt;
{&lt;br /&gt;
	//добыча полного имени экзешника&lt;br /&gt;
	CString csFullExeName;&lt;br /&gt;
	{&lt;br /&gt;
		CString csAppName=GetCommandLine();&lt;br /&gt;
		csAppName.Delete(0,1);&lt;br /&gt;
		csAppName.Replace('\&amp;quot;','\0');&lt;br /&gt;
		csFullExeName=(const char*)csAppName;&lt;br /&gt;
	}&lt;br /&gt;
	//теперь csFullExeName - содержит искомый путь&lt;br /&gt;
&lt;br /&gt;
	//...&lt;br /&gt;
	//...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Каким способом можно exe файл может заменить самого себя? То есть, моя программа обновляется, например, через Internet, и хочет обновить свой exe-файл. Но так как он в данный момент запущен - это будет, естественно, запрещено. Как это можно проще всего сделать?===&lt;br /&gt;
Один из способов - сделать копию экзешника и из него обновиться&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define def_exeNAMEup	&amp;quot;c:\\myprog_update.exe&amp;quot;&lt;br /&gt;
#define def_exeNAMEdnld	&amp;quot;c:\\myprog_downloaded.exe&amp;quot;&lt;br /&gt;
#define def_keyUdate	&amp;quot;/update&amp;quot;&lt;br /&gt;
&lt;br /&gt;
void CTESTFAQApp::UpdateItself()&lt;br /&gt;
{&lt;br /&gt;
	//добыча полного имени экзешника&lt;br /&gt;
	CString csFullExeName;&lt;br /&gt;
	{&lt;br /&gt;
		CString csAppName=GetCommandLine();&lt;br /&gt;
		csAppName.Delete(0,1);&lt;br /&gt;
		csAppName.Replace('\&amp;quot;','\0');&lt;br /&gt;
		csFullExeName=(const char*)csAppName;&lt;br /&gt;
	}&lt;br /&gt;
	//теперь csFullExeName - содержит искомый путь&lt;br /&gt;
&lt;br /&gt;
	//делаем копию экзешника с другим именем&lt;br /&gt;
	CopyFile(csFullExeName,def_exeNAMEup,0);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	//передаём в параметры нового процесса ключ и путь к текущему файлу&lt;br /&gt;
	CString csParams=def_keyUdate;&lt;br /&gt;
	csParams+=&amp;quot; &amp;quot;;&lt;br /&gt;
	csParams+=csFullExeName;&lt;br /&gt;
&lt;br /&gt;
	//запускаем копию&lt;br /&gt;
	STARTUPINFO si;&lt;br /&gt;
	PROCESS_INFORMATION pi;&lt;br /&gt;
	ZeroMemory(&amp;amp;si,sizeof(si));&lt;br /&gt;
	si.cb = sizeof(si);&lt;br /&gt;
	ZeroMemory(&amp;amp;pi,sizeof(pi));&lt;br /&gt;
	if(CreateProcess(def_exeNAMEup,def_keyUdate,0,0,0,0,0,0,&amp;amp;si,&amp;amp;pi))&lt;br /&gt;
	{&lt;br /&gt;
		//завершаем текущий процесс&lt;br /&gt;
		ExitFromMyApp();&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void CTESTFAQApp::ExitFromMyApp()&lt;br /&gt;
{&lt;br /&gt;
	exit(0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
BOOL CTESTFAQApp::InitInstance()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
	//смотрим, не запустили ли для апдейта?&lt;br /&gt;
&lt;br /&gt;
	CString txt;&lt;br /&gt;
	txt=m_lpCmdLine;&lt;br /&gt;
	if(txt.Find(def_keyUdate)==0)&lt;br /&gt;
	{&lt;br /&gt;
		//делаем айдейт&lt;br /&gt;
		txt.Replace(def_keyUdate,&amp;quot;&amp;quot;);&lt;br /&gt;
		txt.TrimLeft();&lt;br /&gt;
&lt;br /&gt;
		CString csFullExeName=txt;&lt;br /&gt;
&lt;br /&gt;
		//берём откуда то уже скачанный файл обновления&lt;br /&gt;
		//...&lt;br /&gt;
		CString csFull_Downloaded_ExeName=def_exeNAMEdnld;&lt;br /&gt;
&lt;br /&gt;
		//копируем файл (обновляем старый то есть)&lt;br /&gt;
		CopyFile(csFull_Downloaded_ExeName,csFullExeName,0);&lt;br /&gt;
&lt;br /&gt;
		//запускаем обновлённого мученника&lt;br /&gt;
		STARTUPINFO si;&lt;br /&gt;
		PROCESS_INFORMATION pi;&lt;br /&gt;
		ZeroMemory(&amp;amp;si,sizeof(si));&lt;br /&gt;
		si.cb = sizeof(si);&lt;br /&gt;
		ZeroMemory(&amp;amp;pi,sizeof(pi));&lt;br /&gt;
		if(CreateProcess(csFullExeName,0,0,0,0,0,0,0,&amp;amp;si,&amp;amp;pi))&lt;br /&gt;
&lt;br /&gt;
		ExitFromMyApp();&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
	//...&lt;br /&gt;
	//...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Есть строка символов (страничка из Инета) в кодировке utf-8 (строка char*). Как мне ее получить в формате String&lt;br /&gt;
или в char* в кодировке ANSI (cp 1251) ?===&lt;br /&gt;
Можно перевести строку из UTF8 в Unicode, затем из Unicode в 1251&lt;br /&gt;
&lt;br /&gt;
Ниже приведена структура, содержащая процедуры перекодирования,&lt;br /&gt;
а также процедуру с примером использования&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//описание структуры&lt;br /&gt;
struct coder&lt;br /&gt;
{&lt;br /&gt;
	//utf8-&amp;gt;unicode&lt;br /&gt;
	static wchar_t* utf8_to_unicode__dontForgetDeleteArr(const char *utf8_string)&lt;br /&gt;
	{&lt;br /&gt;
		wchar_t* pRes=0;&lt;br /&gt;
		int res_len=0;&lt;br /&gt;
&lt;br /&gt;
		//тест на возможность преобразования&lt;br /&gt;
		res_len=MultiByteToWideChar(CP_UTF8,0,utf8_string,-1,0,0);&lt;br /&gt;
		if(!res_len)return 0;&lt;br /&gt;
&lt;br /&gt;
		//выделяем память&lt;br /&gt;
		pRes = new wchar_t[res_len];&lt;br /&gt;
		if(!pRes)return 0;&lt;br /&gt;
&lt;br /&gt;
		//преобразование&lt;br /&gt;
		if(!MultiByteToWideChar(CP_UTF8,0,utf8_string,-1,pRes,res_len))&lt;br /&gt;
		{&lt;br /&gt;
			delete [] pRes;&lt;br /&gt;
			return 0;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		return pRes;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	//unicode-&amp;gt;1251&lt;br /&gt;
	static char * unicode_to_1251__dontForgetDeleteArr(const wchar_t *unicode_string)&lt;br /&gt;
	{&lt;br /&gt;
		char* pRes=0;&lt;br /&gt;
		int res_len=0;&lt;br /&gt;
&lt;br /&gt;
		//тест на возможность преобразования&lt;br /&gt;
		res_len = WideCharToMultiByte(1251,0,unicode_string,-1,0,0,0,0);&lt;br /&gt;
		if(!res_len)return 0;&lt;br /&gt;
&lt;br /&gt;
		//выделяем память&lt;br /&gt;
		pRes=new char[res_len];&lt;br /&gt;
		if(!pRes)return 0;&lt;br /&gt;
&lt;br /&gt;
		//преобразование&lt;br /&gt;
		if(!WideCharToMultiByte(1251,0,unicode_string,-1,pRes,res_len,0,0))&lt;br /&gt;
		{&lt;br /&gt;
			delete [] pRes;&lt;br /&gt;
			return 0;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		return pRes;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	//процедура с примером&lt;br /&gt;
	static void Example()&lt;br /&gt;
	{&lt;br /&gt;
		wchar_t* unicode_string=0;&lt;br /&gt;
		char* cp1251_string=0;&lt;br /&gt;
&lt;br /&gt;
		//исходный текст&lt;br /&gt;
		char utf8_string[] = &amp;quot;UTF-8 + СЂСѓСЃСЃРєРёР№ С‚РµРєСЃС‚&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
		for(;;)&lt;br /&gt;
		{&lt;br /&gt;
&lt;br /&gt;
			unicode_string=utf8_to_unicode__dontForgetDeleteArr(utf8_string);&lt;br /&gt;
			if(!unicode_string)&lt;br /&gt;
			{&lt;br /&gt;
				AfxMessageBox(&amp;quot;Не удалось конвертировать в unicode!&amp;quot;);&lt;br /&gt;
				break;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			cp1251_string = unicode_to_1251__dontForgetDeleteArr(unicode_string);&lt;br /&gt;
&lt;br /&gt;
			if(!cp1251_string)&lt;br /&gt;
			{&lt;br /&gt;
				AfxMessageBox(&amp;quot;Не удалось конвертировать из unicode!&amp;quot;);&lt;br /&gt;
				break;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			break;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		//cp1251_string - результат&lt;br /&gt;
		AfxMessageBox(cp1251_string);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
		//не забываем удалить массивы&lt;br /&gt;
		if(unicode_string)&lt;br /&gt;
		{&lt;br /&gt;
			delete [] unicode_string;&lt;br /&gt;
			unicode_string=0;&lt;br /&gt;
		}&lt;br /&gt;
		if(cp1251_string)&lt;br /&gt;
		{&lt;br /&gt;
			delete [] cp1251_string;&lt;br /&gt;
			cp1251_string=0;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
//вызов примера&lt;br /&gt;
coder::Example();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как организовать взаимодействие программы на VC.net с Access-овской базой данных?===&lt;br /&gt;
Проще всего подключить ADO компоненты и сделать все на них.&lt;br /&gt;
Компоненты  ADO (ADODC,DATAGRID и т.п.) это ActiveX.&lt;br /&gt;
В редакторе ресурсов, во всплывающем меню, есть Insert ActiveX Control -&amp;gt; открывается список всех компоент,&lt;br /&gt;
зарегистрированых на машине. Нужно найти компоненты (Это компоненты от MS и они помечены (OLEDB)) и вставить их в диалог. Для того что бы иметь возможность управлять ими, нужно импортировать обертки для них, это делается при помощи ClassWisard, там есть импорт-&amp;gt;класс-&amp;gt;указать файл с компоентой (OSX).&lt;br /&gt;
Появляется список всех классов, объявленых внутри.&lt;br /&gt;
Проставляем галочки, нажимаем ОК.&lt;br /&gt;
&lt;br /&gt;
[[Category:FAQ]]&lt;/div&gt;</summary>
		<author><name>Mczim</name></author>	</entry>

	<entry>
		<id>https://wiki.shelek.ru/index.php?title=FAQ:WinAPI,_VCPP_Part_3&amp;diff=418</id>
		<title>FAQ:WinAPI, VCPP Part 3</title>
		<link rel="alternate" type="text/html" href="https://wiki.shelek.ru/index.php?title=FAQ:WinAPI,_VCPP_Part_3&amp;diff=418"/>
				<updated>2008-08-14T18:56:48Z</updated>
		
		<summary type="html">&lt;p&gt;Mczim: Как открыть проекцию файла в память и как с ней работать? &amp;gt; Создаем проекцию&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Имеется приложение на основе CRichEditView. Как узнать, что пользователь меняет текст?===&lt;br /&gt;
Добавить обработчик сообщения EN_CHANGE. Сообщение генерируется CRichEditView каждый раз, когда пользователь изменяет текст в окне CRichEditView&lt;br /&gt;
===Чем метод CArray::GetSize отличается от метода CArray::GetCount?===&lt;br /&gt;
Абсолютно ничем. (Скорее всего, были предыдущие библиотеки, в которых функции, одинаковые по смыслу, имели разные имена. Поэтому в целях совместимости оставили оба)&lt;br /&gt;
===Как загрузить строку из ресурса?===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CString m_Temp;&lt;br /&gt;
m_Temp.LoadString(ID_MYSTRING);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как поменять иконку у элемента (item) в CListCtrl?===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//заполняем структуру LVITEM&lt;br /&gt;
LVITEM lvItem;&lt;br /&gt;
memset(&amp;amp;lvItem,0,sizeof(lvItem));&lt;br /&gt;
	&lt;br /&gt;
lvItem.mask = LVIF_IMAGE;//меняться будет картинка&lt;br /&gt;
lvItem.iItem = ...;// индекс элемента списка (Zero-based)&lt;br /&gt;
lvItem.iSubItem = 0;&lt;br /&gt;
lvItem.iImage = ...; //индекс иконки (из списка контрола)&lt;br /&gt;
	&lt;br /&gt;
pList-&amp;gt;SetItem(&amp;amp; lvItem);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Имеется класс Class1, содержащий мембер типа указатель на Class2. В Class2 также имеется указатель на Class1. Компилятор выдаёт ошибку. Что надо делать?===&lt;br /&gt;
Предварительно объявляем класс Class2. Тогда компилятору будет известно, что описание класса Class2 будет встречено дальше, и станет возможным объявление указателей на класс до описания самого класса.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Class2;//предопределение&lt;br /&gt;
	&lt;br /&gt;
Class1&lt;br /&gt;
{&lt;br /&gt;
	Class2* p;&lt;br /&gt;
};&lt;br /&gt;
	&lt;br /&gt;
Class2&lt;br /&gt;
{&lt;br /&gt;
	Class1* p;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как переключить раскладку в другом (то есть в активном) процессе?===&lt;br /&gt;
Использовать функции:&lt;br /&gt;
   GetKeyboardLayout - определить текущую раскладку&lt;br /&gt;
   LoadKeyboardLayout - загрузить новую раскладку&lt;br /&gt;
&lt;br /&gt;
см.также&lt;br /&gt;
   VerLanguageName - получить строку с описанием языка&lt;br /&gt;
&lt;br /&gt;
(подробности - в MSDN)&lt;br /&gt;
===Как получить хендл контрола Edit зная его ID?===&lt;br /&gt;
Пусть контрол лежит на окне CMyWnd&lt;br /&gt;
Тогда:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void CMyWnd::некая_процедура()&lt;br /&gt;
{&lt;br /&gt;
	//для MFC&lt;br /&gt;
	CEdit* ed=(CEdit* ) GetDlgItem(ID_EDIT1);&lt;br /&gt;
	HWND hwnd=ed-&amp;gt;GetSafeHwnd();&lt;br /&gt;
	...&lt;br /&gt;
	&lt;br /&gt;
	//для Win32 API&lt;br /&gt;
	HWND hwnd=GetDlgItem(m_hWnd,ID_EDIT1);&lt;br /&gt;
	...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Как из дочернего окна закрыть приложение?===&lt;br /&gt;
Нужно послать родительскому окну (*pParent) сообщение WM_CLOSE:&lt;br /&gt;
 pParent-&amp;gt;PostMessage(WM_CLOSE);//MFC&lt;br /&gt;
или&lt;br /&gt;
 ::PostMessage(pParent-&amp;gt;m_hWnd,WM_CLOSE,(WPARAM)0,(LPARAM)0);//API&lt;br /&gt;
===Как корректно перевести BSTR в CString и наоборот?===&lt;br /&gt;
Нужно просто присвоить переменной типа CString переменную типа BSTR.&lt;br /&gt;
Оператор = класса CString сам всё переведёт.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//указатель на будущий буфер с BSTR.&lt;br /&gt;
//	(По сути, BSTR определён как &lt;br /&gt;
//	typedef WCHAR* BSTR;&lt;br /&gt;
//	то есть указатель на 16-битный символ юникод)&lt;br /&gt;
	&lt;br /&gt;
BSTR bstrHE=0;&lt;br /&gt;
	&lt;br /&gt;
CString Str=&amp;quot;мой текст&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
//Выделить память и загрузить адрес блока в bstrHE&lt;br /&gt;
bstrHE=Str.AllocSysString();&lt;br /&gt;
	&lt;br /&gt;
//...	&lt;br /&gt;
//тут работаем с bstrHE[]&lt;br /&gt;
//...&lt;br /&gt;
	&lt;br /&gt;
//освобождаем память&lt;br /&gt;
SysFreeString(bstrHE);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Как получить доступ к графическим ресурсам элементов текущей темы оформления Windows?===&lt;br /&gt;
Использовать функции&lt;br /&gt;
&lt;br /&gt;
OpenThemeData()&lt;br /&gt;
DrawThemeBackground()&lt;br /&gt;
DrawFrameControl()&lt;br /&gt;
CloseThemeData().&lt;br /&gt;
&lt;br /&gt;
(подробности - в MSDN)&lt;br /&gt;
===Имеется класс , производный от CDialog. Когда диалог в фокусе, нажатие на Enter или Esc приводит к закрытию диалога. Как это запретить?===&lt;br /&gt;
При нажатии Enter происходит выполнение команды IDOK,&lt;br /&gt;
при нажатии Esc - IDCANCEL.&lt;br /&gt;
Нужно переопределить в классе виртуальные функции OnOk() и OnCancel(),&lt;br /&gt;
которые соответственно вызываются для этих команд. При помощи&lt;br /&gt;
визарда эти функции добавить можно так: Положить на диалог две кнопки&lt;br /&gt;
с идентификаторами IDOK и IDCANCEL (при создании нового диалога они там&lt;br /&gt;
есть сразу), затем двойной клик по кнопке добавляет соответствующий&lt;br /&gt;
обработчик. В обработчиках надо удалить вызовы СDialog::OnOK() и&lt;br /&gt;
CDialog::OnCancel(), тогда диалог закрываться не будет.&lt;br /&gt;
Однако тогда диалог станет невозможно закрыть кнопкой с крестиком  :)&lt;br /&gt;
&lt;br /&gt;
Лечить так: добавить обработчик сообщения WM_CLOSE - OnClose(), и в нём&lt;br /&gt;
сделать вызов OnOk() или OnCancel() :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void CPlayersPropsDialog::OnClose() &lt;br /&gt;
{&lt;br /&gt;
	CDialog::OnClose();&lt;br /&gt;
	CDialog::OnCancel();//добавлено&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===VC++6. Я написал простейший макрос, а компилятор на него ругается. Ума не приложу, что за глюк?===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	#define my_macr(x,y,z) \&lt;br /&gt;
		z=\&lt;br /&gt;
		(x+y)*\&lt;br /&gt;
		(x-y)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Скорее всего после одного из символов соединения строк &amp;quot;\&amp;quot; имеется&lt;br /&gt;
пробел или табуляция. Их надо удалить. Можно найти их &amp;quot;наощупь&amp;quot;, а&lt;br /&gt;
можно включить показ непечатных символов в студии. Найти эту команду&lt;br /&gt;
можно так:&lt;br /&gt;
Tools-&amp;gt;Customize...-&amp;gt;вкладка Commands. В окошке Category выбрать&lt;br /&gt;
&amp;quot;Edit&amp;quot;, и среди кнопок справа найти кнопку, на которой написано &amp;quot;a.b&amp;quot;&lt;br /&gt;
Эту кнопку надо перетащить на одну из панелей инструментов студии.&lt;br /&gt;
&lt;br /&gt;
===Как получить список всех процесов, включая idle?===&lt;br /&gt;
Использовать функции&lt;br /&gt;
Process32First()&lt;br /&gt;
Precess32Next()&lt;br /&gt;
&lt;br /&gt;
===Как программно установить переменные окружения?===&lt;br /&gt;
Чтобы добавить или изменить их программно, необходимо воспользоваться&lt;br /&gt;
ключом реестра HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\&lt;br /&gt;
Session Manager\Environment, а затем отправить широковещательное&lt;br /&gt;
сообщение WM_SETTINGCHANGE. Это позволит приложениям узнать об&lt;br /&gt;
изменениях:&lt;br /&gt;
&lt;br /&gt;
::SendMessage(HWND_BROADCAST,WM_SETTINGCHANGE,0,0);&lt;br /&gt;
===Как сделать, чтобы у окна был черный фон?===&lt;br /&gt;
переопределить обработчик сообщения WM_CTLCOLOR - OnCtlColor() :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CBrush br(RGB(0,0,0));&lt;br /&gt;
	&lt;br /&gt;
HBRUSH CMyDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) &lt;br /&gt;
{&lt;br /&gt;
	HBRUSH hbr = CMyDlg::OnCtlColor(pDC, pWnd, nCtlColor);&lt;br /&gt;
	&lt;br /&gt;
	//фон диалога (или вьюшки)&lt;br /&gt;
	if(nCtlColor==CTLCOLOR_DLG)&lt;br /&gt;
	{&lt;br /&gt;
		return (HBRUSH)br;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	//фон статиков (если нужно)&lt;br /&gt;
	if(nCtlColor==CTLCOLOR_STATIC)&lt;br /&gt;
	{&lt;br /&gt;
		//делаем фон текста статика прозрачным&lt;br /&gt;
		pDC-&amp;gt;SetBkMode(TRANSPARENT);&lt;br /&gt;
		return (HBRUSH)br;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	return hbr;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Почему на моем компьютере экзешник, созданный в MFC запускается, а на других компьютерах - нет? Требует какую-то  dll-ку.===&lt;br /&gt;
Нужно выбирать режим Release :&lt;br /&gt;
&lt;br /&gt;
Menu-&amp;gt;Build-&amp;gt;Configurations...-&amp;gt;Release,&lt;br /&gt;
&lt;br /&gt;
и экзешник, соответственно, брать из папки Release проекта&lt;br /&gt;
===Как в диалог добавить меню?===&lt;br /&gt;
Надо сделать в ресурсах меню, затем вставить в диалог:&lt;br /&gt;
&lt;br /&gt;
открыть в редакторе диалог, в свойствах (во вкладке General, окошко Menu) указать идентивикатор ресурса меню.&lt;br /&gt;
При помощи визарда добавить для меню обработчики OnCommand() и OnUpdateСommand().&lt;br /&gt;
===Я добавил визардом меню в диалог. Добавил обработчики для пунктов меню. Пункты работают, но OnUpdate для пунктов не вызывается - то есть не получается ни затенить, ни чек поставить. Что делать?===&lt;br /&gt;
В диалоге у меню апдейта не происходит сам, в отличие от мейнфрейма.&lt;br /&gt;
Для этого нужно сделать самим апдейт в обработчике сообщения WM_KICKIDLE.&lt;br /&gt;
Визардом обработчик не добавляется, поэтому можно переопределить виртуальную DefWindowProc() и там обработать:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;afxpriv.h&amp;gt;	//этот файл надо включить, там определёна WM_KICKIDLE&lt;br /&gt;
&lt;br /&gt;
LRESULT CMyDialog::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam) &lt;br /&gt;
{&lt;br /&gt;
	if(message==WM_KICKIDLE)&lt;br /&gt;
	{&lt;br /&gt;
		//делаем апдейт для всех пунктов меню&lt;br /&gt;
		CMenu* pMainMenu=GetMenu();&lt;br /&gt;
		if(pMainMenu)&lt;br /&gt;
		{&lt;br /&gt;
			CCmdUI cmdUI;&lt;br /&gt;
			for (UINT n=0; n &amp;lt; pMainMenu-&amp;gt;GetMenuItemCount(); ++n)&lt;br /&gt;
			{&lt;br /&gt;
				CMenu* pSubMenu = pMainMenu-&amp;gt;GetSubMenu(n);&lt;br /&gt;
				if(!pSubMenu)continue;&lt;br /&gt;
	&lt;br /&gt;
				cmdUI.m_nIndexMax = pSubMenu-&amp;gt;GetMenuItemCount();&lt;br /&gt;
				for (UINT i = 0; i &amp;lt; cmdUI.m_nIndexMax;++i)&lt;br /&gt;
				{&lt;br /&gt;
					cmdUI.m_nIndex = i;&lt;br /&gt;
					cmdUI.m_nID = pSubMenu-&amp;gt;GetMenuItemID(i);&lt;br /&gt;
					cmdUI.m_pMenu = pSubMenu;&lt;br /&gt;
					cmdUI.DoUpdate(this, FALSE);&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	return CDialog::DefWindowProc(message, wParam, lParam);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Как на Visual C++ 6.0 в Главном окне отключить системное меню (в левом верхнем углу) и кнопки(в правом верхнем углу)?===&lt;br /&gt;
При создании окна нужно убрать стиль WS_SYSMENU&lt;br /&gt;
(теперь пользователь корректно может закрыть окно только Alt+F4,&lt;br /&gt;
ну или если вы предоставите ему дополнительную возможность сделать это)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пример 1. (для SDI, MDI)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//этот обработчик уже добавлен визардом&lt;br /&gt;
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT&amp;amp; cs)&lt;br /&gt;
{&lt;br /&gt;
	if( !CFrameWnd::PreCreateWindow(cs) )&lt;br /&gt;
		return FALSE;&lt;br /&gt;
	// TODO: Modify the Window class or styles here by modifying&lt;br /&gt;
	//  the CREATESTRUCT cs&lt;br /&gt;
&lt;br /&gt;
	///////////////////////////////&lt;br /&gt;
	//добавленная часть&lt;br /&gt;
	{&lt;br /&gt;
		//убираем стиль&lt;br /&gt;
		cs.style&amp;amp;=~WS_SYSMENU;&lt;br /&gt;
	}&lt;br /&gt;
	///////////////////////////////&lt;br /&gt;
&lt;br /&gt;
	return TRUE;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Пример 2. (для диалога)&lt;br /&gt;
Если диалог описан в ресурсах, то в свойствах диалога убрать галочки&lt;br /&gt;
  &amp;quot;System menu&amp;quot;&lt;br /&gt;
  &amp;quot;Minimize box&amp;quot;&lt;br /&gt;
  &amp;quot;Maximize box&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===Хочу сделать так, чтобы пользователь не мог нажать на кнопку, пока программа не разрешит.===&lt;br /&gt;
Нужно применить метод класса CWnd::EnableWindow(...) для кнопки.&lt;br /&gt;
Значение параметра 0 делает кнопку неактивной, 1 - делает активной.&lt;br /&gt;
(кстате, не только для кнопки можно, а для любого класса, производного&lt;br /&gt;
от класса CWnd)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пусть имеется некий диалог, на нём лежит кнопка c ID == IDC_1.&lt;br /&gt;
в любом месте кода диалога (кроме конструктора и деструктора , хотя, если&lt;br /&gt;
проверить наличие валидного хендла диалога, как в примере, то ничего&lt;br /&gt;
страшного не будет и там)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//делаем кнопку неактивной&lt;br /&gt;
if(m_hWnd)&lt;br /&gt;
{&lt;br /&gt;
	CWnd* pw=0;&lt;br /&gt;
	pw=GetDlgItem(IDC_1);&lt;br /&gt;
	if(pw)pw-&amp;gt;EnableWindow(0);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Что означают сообщения, которые студия выводит при компиляции, вроде таких : Loaded 'C:\WINDOWS\SYSTEM\WSOCK32.DLL', no matching symbolic information found. ===&lt;br /&gt;
Это строка говорит о том, что студия не смогла найти отладочные&lt;br /&gt;
символы для WSOCK32.DLL. В этом нет ничего страшного, просто при наличии&lt;br /&gt;
отладочных символов в процессе отладки можно получить доступ к именам&lt;br /&gt;
функции из системных DLL. Например, вместо&lt;br /&gt;
 KERNEL32! 0x77E8B184() -&lt;br /&gt;
 увидим&lt;br /&gt;
 KERNEL32!CreateThread.&lt;br /&gt;
===Как обработать сообщения, которое приходит к некому контролу (скажем CEdit)?===&lt;br /&gt;
Нужно произвести от CEdit свой класс, и в виртуальной процедуре класса WindowProc перехватить нужные сообщения.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
virtual LRESULT WindowProc(&lt;br /&gt;
   UINT message,&lt;br /&gt;
   WPARAM wParam,&lt;br /&gt;
   LPARAM lParam &lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Пример. Полностью выключаем, скажем, обработку сообщения WM_CHAR&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	LRESULT CMyEdit::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) &lt;br /&gt;
	{&lt;br /&gt;
		switch(message)&lt;br /&gt;
		{&lt;br /&gt;
			case WM_CHAR:&lt;br /&gt;
			{&lt;br /&gt;
				return 0;&lt;br /&gt;
			}&lt;br /&gt;
			break;&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		return CEdit::WindowProc(message, wParam, lParam);&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Чтобы связать экземпляр класса с контролом на форме, добавьте визардом для&lt;br /&gt;
контрола переменную класса (выбрав не Value а Control).&lt;br /&gt;
&lt;br /&gt;
===Как настроить количество пробелов в табуляции?===&lt;br /&gt;
Tools-&amp;gt;Options-&amp;gt;Tabs-&amp;gt;Insert Spaces&lt;br /&gt;
(или  правой кнопкой мыши по тексту-&amp;gt; properties)&lt;br /&gt;
===Как автоматически расставить отступы?===&lt;br /&gt;
Выделить текст для форматирования, нажать Alt+F8&lt;br /&gt;
&lt;br /&gt;
Есть ещё программа Artistic Style, которая занимается&lt;br /&gt;
переформатированием кода&lt;br /&gt;
http://sourceforge.net/projects/astyle/&lt;br /&gt;
===Поиск границ блока===&lt;br /&gt;
&amp;quot;CTRL+ }&amp;quot; ищет парную фигурную скобку в тексте и переходит на неё&lt;br /&gt;
===Вертикальное выделение текста===&lt;br /&gt;
&amp;quot;Alt + выделение мышкой&amp;quot; - позволяет выделять вертикальные фрагменты текста&lt;br /&gt;
===Как узнать количество установленных в CListCtrl столбцов?===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CListCtrl* pL=...; //указатель на переменную-контрол&lt;br /&gt;
&lt;br /&gt;
int count=pL-&amp;gt;GetHeaderCtrl()-&amp;gt;GetItemCount();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Как получить иконку приложения?===&lt;br /&gt;
Если приложение запущено, то нужно найти его главное окно и&lt;br /&gt;
послать ему сообщение WM_GETICON.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//функция возвращант хендл иконки &lt;br /&gt;
LRESULT SendMessage(hWnd, WM_GETICON, wParam, 0);&lt;br /&gt;
&lt;br /&gt;
//hWnd == хендл окна приложения&lt;br /&gt;
//wParam == &lt;br /&gt;
//	1)==ICON_BIG - получить большую иконку&lt;br /&gt;
//	2)==ICON_SMALL - получить маленькую иконку&lt;br /&gt;
//	3)==ICON_SMALL2 - получить маленькую иконку, если она определена&lt;br /&gt;
//				в приложении. Если её нет, то маленькую иконку, &lt;br /&gt;
//				сгенерированную системой из большой иконки&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как в CString можно найти или вырезать часть строки?===&lt;br /&gt;
есть такие методы в CString:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//вырезает кусок строки&lt;br /&gt;
CString Mid(int nFirst) const;&lt;br /&gt;
CString Mid(int nFirst,  int nCount) const;&lt;br /&gt;
&lt;br /&gt;
//возвращает кусок строки (сначала или с конца)&lt;br /&gt;
CString Left(int nCount ) const;&lt;br /&gt;
CString Right(int nCount ) const;&lt;br /&gt;
&lt;br /&gt;
//возвращает начальный кусок строки, в котором есть только&lt;br /&gt;
//символы из набора,представленного в lpszCharSet&lt;br /&gt;
CString SpanIncluding(LPCTSTR lpszCharSet ) const;&lt;br /&gt;
&lt;br /&gt;
//возвращает начальный кусок строки, в котором нет&lt;br /&gt;
//символов из набора,представленного в lpszCharSet&lt;br /&gt;
CString SpanExcluding(LPCTSTR lpszCharSet ) const; &lt;br /&gt;
&lt;br /&gt;
//убирает &amp;quot;пробелоподобные&amp;quot; символы из самого начала строки&lt;br /&gt;
//(то есть - пробел, табуляцию (\t) , возврат каретки, перевод строки (/r/n))&lt;br /&gt;
void TrimLeft();&lt;br /&gt;
//убирает все повторы символа из самого начала строки&lt;br /&gt;
void TrimLeft(TCHAR chTarget );&lt;br /&gt;
//убирает из самого начала строки все символа из набора lpszTargets &lt;br /&gt;
void TrimLeft(LPCTSTR lpszTargets ); &lt;br /&gt;
&lt;br /&gt;
void TrimRight();&lt;br /&gt;
void TrimRight(TCHAR chTarget );&lt;br /&gt;
void TrimRight(LPCTSTR lpszTargets ); &lt;br /&gt;
&lt;br /&gt;
//поиск в строке&lt;br /&gt;
int Find( TCHAR ch ) const;&lt;br /&gt;
int Find( LPCTSTR lpszSub ) const;&lt;br /&gt;
int Find( TCHAR ch, int nStart ) const;&lt;br /&gt;
int Find( LPCTSTR pstr, int nStart ) const;&lt;br /&gt;
&lt;br /&gt;
//поиск, начиная с конца&lt;br /&gt;
int ReverseFind( TCHAR ch ) const;&lt;br /&gt;
&lt;br /&gt;
//поиск позиции первого символа, одного из набора,&lt;br /&gt;
// представленного в lpszCharSet&lt;br /&gt;
int FindOneOf( LPCTSTR lpszCharSet ) const;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Есть у меня CListBox и я в ходе выполнения программы добавляю в него строки. Но я не могу посмотреть что именно добавляется. Вывод результатов происходит в конце выполнения процедуры...===&lt;br /&gt;
Если нужно делать принудительную перерисовку окна во время&lt;br /&gt;
длительных вычислений, то нужно вызывать для окна, которое&lt;br /&gt;
надо перерисовать метод&lt;br /&gt;
  RedrawWindow()&lt;br /&gt;
с параметрами по умолчанию, или пару&lt;br /&gt;
  Invalidate(0);&lt;br /&gt;
  UpdateWindow();&lt;br /&gt;
Это приводит к пометке всего окна к перерисовке и отправлению&lt;br /&gt;
сообщения WM_PAINT в оконную процедуру в обход очереди&lt;br /&gt;
сообщений, вызывая немедленную перерисовку окна.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CWnd* pw=...;//окно, которое надо перерисовывать&lt;br /&gt;
&lt;br /&gt;
for(int i=0;i&amp;lt;10000)&lt;br /&gt;
{&lt;br /&gt;
	//меняется содержимое окна&lt;br /&gt;
	//...&lt;br /&gt;
&lt;br /&gt;
	//немедленная перерисовка&lt;br /&gt;
	pw-&amp;gt;Invalidate(0);&lt;br /&gt;
	pw-&amp;gt;UpdateWindow();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Я написал DLL, которую используют несколько приложений. Всё вроде работает, но когда происходит очередной вызов функции из DLL, почему то данные в функции обнуляются. С чем это связано?===&lt;br /&gt;
Переменные и массивы в DLL, содержимое которых должно использоваться несколькими процессами, должны объявляться статическими. Статическая переменная или массив инициализируются только один раз в момент загрузки DLL.&lt;br /&gt;
Пример:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DWORD calltest()&lt;br /&gt;
{&lt;br /&gt;
	//будет выполнено только при первом вызове&lt;br /&gt;
	static DWORD callcount=0;&lt;br /&gt;
	static DWORD str[1000]={0}; &lt;br /&gt;
&lt;br /&gt;
	//будет выполняться каждый раз&lt;br /&gt;
	return ++callcount;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Как открыть проекцию файла в память и как с ней работать?===&lt;br /&gt;
Создаем проекцию&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HANDLE CreateFileMapping(&lt;br /&gt;
  HANDLE hFile,	//хендл уже открытого файла&lt;br /&gt;
  LPSECURITY_ATTRIBUTES lpAttributes,&lt;br /&gt;
  DWORD flProtect,	//способ открытия проекции&lt;br /&gt;
  DWORD dwMaximumSizeHigh,	//размер файла (старшие 4 байта , обычно==0)&lt;br /&gt;
  DWORD dwMaximumSizeLow,	//размер файла (младшие 4 байта)&lt;br /&gt;
  LPCTSTR lpName&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Доступ к созданной проекции производится процедурой&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LPVOID MapViewOfFile(&lt;br /&gt;
  HANDLE hFileMappingObject, //хендл проекции&lt;br /&gt;
  DWORD dwDesiredAccess,	//способ работы с проекцией&lt;br /&gt;
  DWORD dwFileOffsetHigh,&lt;br /&gt;
  DWORD dwFileOffsetLow, //смещение от начала файла (младшие 4 байта)&lt;br /&gt;
  SIZE_T dwNumberOfBytesToMap //длина в байтах (если ==0 - то весь файл)&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
далее с файлом можно работать как с обычным массивом в памяти.&lt;br /&gt;
&lt;br /&gt;
После работы с проекцией, её надо освободить процедурой&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
BOOL UnmapViewOfFile(&lt;br /&gt;
  LPCVOID lpBaseAddress //адрес, который вернула процедура MapViewOfFile&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Пример.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HANDLE hMapFile=0;//для проекции&lt;br /&gt;
&lt;br /&gt;
HANDLE hFile=...;//хендл уже открытого файла&lt;br /&gt;
DWORD dwdFileLen=...;//размер открытого файла&lt;br /&gt;
&lt;br /&gt;
//создаём проекцию &amp;quot;только для чтения&amp;quot;&lt;br /&gt;
hMapFile=::CreateFileMapping(hFile,0,PAGE_READONLY,0,dwdFileLen,0);&lt;br /&gt;
&lt;br /&gt;
//хендл hFile можно закрыть уже здесь, в принципе,&lt;br /&gt;
//но мы сделаем это позже&lt;br /&gt;
&lt;br /&gt;
//получаем доступ к проекции (тоже только для чтения)&lt;br /&gt;
BYTE* pbyFile=(BYTE*)::MapViewOfFile(hMapFile,FILE_MAP_READ,0,0,0);&lt;br /&gt;
&lt;br /&gt;
///////////////////&lt;br /&gt;
//тут работаем с массивом pbyFile[dwdFileLen] как с обычным,&lt;br /&gt;
//только не забываем, что он открыт только для чтения&lt;br /&gt;
//...&lt;br /&gt;
//...&lt;br /&gt;
//...&lt;br /&gt;
///////////////////&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//отключаем файл данных от адресного пространства&lt;br /&gt;
UnmapViewOfFile(pbyFile);&lt;br /&gt;
&lt;br /&gt;
//освобождаем хендл проекции&lt;br /&gt;
CloseHandle(hMapFile)&lt;br /&gt;
&lt;br /&gt;
//освобождаем хендл открытого файла&lt;br /&gt;
CloseHandle(hFile);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Использую MFC Grid control 2.25 , не получается отобразить картинку в ячейке. Как это делается ?===&lt;br /&gt;
Нужно создать список изображений (CImageList) , затем передать указатель на список в контрол. Поскольку контрол лишь копирует указатель , список должен создаваться динамически, либо быть членом класса, экземпляр которого существует всё время работы контрола.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 m_GridMarket&lt;br /&gt;
CImageList m_ImageList;&lt;br /&gt;
CGridCtrL m_Grid1&lt;br /&gt;
...&lt;br /&gt;
...&lt;br /&gt;
//неким образом создаётся список&lt;br /&gt;
m_ImageList.Create(...);&lt;br /&gt;
//...&lt;br /&gt;
&lt;br /&gt;
//вставляем в контрол&lt;br /&gt;
m_Grid1.SetImageList(&amp;amp;m_ImageList);&lt;br /&gt;
&lt;br /&gt;
//&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как при помощи IPicture отобразить картинку из файла? ===&lt;br /&gt;
Пример - несложная функция, отображающая картинку из файла&lt;br /&gt;
&lt;br /&gt;
поддерживаются форматы&lt;br /&gt;
BMP, GIF, JPEG, PNG, TIFF, EMF&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;quot;atlconv.h&amp;quot;&lt;br /&gt;
#define HandleIsValid(H) (H!=(HANDLE)-1 &amp;amp;&amp;amp; H!=(HANDLE)0)&lt;br /&gt;
&lt;br /&gt;
//*pDestDC - CDC, на который предполагается вывод картинки&lt;br /&gt;
//pchzFilePath - путь к файлу&lt;br /&gt;
//pWid - (возвращает) ширина картинки&lt;br /&gt;
//pHig - (возвращает) высота картинки&lt;br /&gt;
bool DrawBitmapFromFile(CDC* pDestDC,const char* pchzFilePath,int *pWid=0,int *pHig=0)&lt;br /&gt;
{&lt;br /&gt;
	bool result=false;&lt;br /&gt;
&lt;br /&gt;
	if(pWid)*pWid=0;&lt;br /&gt;
	if(pHig)*pHig=0;&lt;br /&gt;
&lt;br /&gt;
	int Wid=0;&lt;br /&gt;
	int Hig=0;&lt;br /&gt;
&lt;br /&gt;
	IPicture* pPic=0;&lt;br /&gt;
	try&lt;br /&gt;
	{&lt;br /&gt;
		IPicture* ptmpPic=0;&lt;br /&gt;
		USES_CONVERSION;&lt;br /&gt;
		HRESULT hr;&lt;br /&gt;
&lt;br /&gt;
		CString txt=pchzFilePath;&lt;br /&gt;
		hr= ::OleLoadPicturePath(&lt;br /&gt;
			const_cast&amp;lt;LPOLESTR&amp;gt;(T2COLE(txt)),&lt;br /&gt;
			0,0,0,IID_IPicture,&lt;br /&gt;
			reinterpret_cast&amp;lt;void **&amp;gt;(&amp;amp;ptmpPic)&lt;br /&gt;
			);&lt;br /&gt;
&lt;br /&gt;
		if(hr==S_OK &amp;amp;&amp;amp; ptmpPic)&lt;br /&gt;
		{&lt;br /&gt;
			pPic=ptmpPic;&lt;br /&gt;
		}&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			throw 0;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		OLE_XPOS_HIMETRIC cxSrc;&lt;br /&gt;
		OLE_YPOS_HIMETRIC cySrc;&lt;br /&gt;
&lt;br /&gt;
		if(S_OK!=pPic-&amp;gt;get_Width(&amp;amp;cxSrc))throw 0;&lt;br /&gt;
		if(S_OK!=pPic-&amp;gt;get_Height(&amp;amp;cySrc))throw 0;&lt;br /&gt;
&lt;br /&gt;
		Wid=cxSrc/26;&lt;br /&gt;
		Hig=cySrc/26;&lt;br /&gt;
&lt;br /&gt;
		//рисуем&lt;br /&gt;
		if(S_OK !=pPic-&amp;gt;Render(pDestDC-&amp;gt;GetSafeHdc(),&lt;br /&gt;
			0,Hig,Wid,-Hig,0,0,cxSrc,cySrc,0))throw 0;&lt;br /&gt;
	}&lt;br /&gt;
	catch(...)&lt;br /&gt;
	{&lt;br /&gt;
		result=false;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if(pPic)&lt;br /&gt;
	{&lt;br /&gt;
		pPic-&amp;gt;Release();&lt;br /&gt;
		pPic=0;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	if(pWid)*pWid=Wid;&lt;br /&gt;
	if(pHig)*pHig=Hig;&lt;br /&gt;
&lt;br /&gt;
	return result;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===У меня модальное диалоговое окно, в нем поле редактирования мультилайновое, т.е. чтобы перейти на новую строку надо нажать ентер, но вызывается стандартный обработчик диалогового окна. Подскажите, что делать?===&lt;br /&gt;
Нужно в редакторе ресурсов поставить для CEdit окошка галочку&lt;br /&gt;
свойства WantReturn,&lt;br /&gt;
&lt;br /&gt;
или добавить ES_WANTRETURN при создании CEdit контрола динамически.&lt;br /&gt;
===Как выводят картинку-логотип(splash screen) при запуске программы? То есть, когда загружается программа на экран выводится картинка, потом она исчезает(загрузка программы закончена) и пользователь может приступать к работе ===&lt;br /&gt;
Для этого используется класс, производный от CDialog. Этот диалог после создания показывает себя на экран, выводя на себя рисунок. Также запускает таймет, по срабатывани которого диалог гасится. Создаётся диалог InitInstance приложения.&lt;br /&gt;
&lt;br /&gt;
В VC6++ также есть уже готовый компонент&lt;br /&gt;
Project-&amp;gt;Add To Project -&amp;gt; Components and Controls-&amp;gt;(в папке &amp;quot;Visual C++ Components&amp;quot; есть SplashScreen.)&lt;br /&gt;
===Как сделать, чтобы при выпадении списка у ComboBox была не одна строка, а больше, вроде все свойства покрутил, не помогает Вместо выпадающего списка одна строка и скролл...===&lt;br /&gt;
В редакторе ресурсов надо щелкнуть в комбобоксе на треугольнике - появляется рамка для растягивания вниз - размер выпадающего списка.&lt;br /&gt;
===В VC++.net , что делать после того, как на форму установил ActiiveX ListView, как объявить класс и переменную для этого элемента?===&lt;br /&gt;
Щёлкнуть правой кнопкой мыши на элементе , в меню - add variable или add class&lt;br /&gt;
===Как вставить данные в буфер обмена (Clipboard) ? Как их оттуда вытащить ?===&lt;br /&gt;
&lt;br /&gt;
1) копирование в буфер обмена:&lt;br /&gt;
&lt;br /&gt;
  1.Готовим данные&lt;br /&gt;
    а.Выделяем память из кучи,  вызывая GlobalAlloc()&lt;br /&gt;
    б.Получаем указатель на выделенную память, вызывая GlobalLock()&lt;br /&gt;
    в.Заполняем данные&lt;br /&gt;
    г.Освобождаем указатель , вызывая GlobalUnlock();&lt;br /&gt;
&lt;br /&gt;
  2.Открываем буфер обмена , вызывая OpenClipboard();&lt;br /&gt;
  3.Очищаем буфер, вызывая EmptyClipboard();&lt;br /&gt;
  4.Вызываем SetClipboardData() один раз для каждого формата&lt;br /&gt;
      вставляемых данных (имеется в виду - если одни и те же&lt;br /&gt;
      данные представлены в разных форматах, и приложение&lt;br /&gt;
      может эти форматы создать)&lt;br /&gt;
  5.Закрываем буфер, вызывая CloseClipboard();&lt;br /&gt;
  6.ВЫЗЫВАТЬ GlobalFree() НЕ НУЖНО , в этом случае это&lt;br /&gt;
      предоставлено системе&lt;br /&gt;
&lt;br /&gt;
Скажем, хотим поместить в буфер обмена туда текст.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	//готовим данные&lt;br /&gt;
	//выделяем из кучи память для данных&lt;br /&gt;
	HANDLE hglbCopy = GlobalAlloc(GMEM_MOVEABLE,10);&lt;br /&gt;
	if(!hglbCopy)return;&lt;br /&gt;
&lt;br /&gt;
	//получаем указатель&lt;br /&gt;
	void* lpStr = GlobalLock(hglbCopy);&lt;br /&gt;
	if(!lpStr)return;&lt;br /&gt;
&lt;br /&gt;
	//заполняем данные&lt;br /&gt;
	strcpy((char*)lpStr,&amp;quot;my text&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	//освобождаем указатель&lt;br /&gt;
	GlobalUnlock(hglbCopy);&lt;br /&gt;
	lpStr=0;&lt;br /&gt;
&lt;br /&gt;
	//открываем буфер обмена&lt;br /&gt;
	OpenClipboard();&lt;br /&gt;
	//очищаем&lt;br /&gt;
	EmptyClipboard();&lt;br /&gt;
&lt;br /&gt;
	//текстовый формат&lt;br /&gt;
	SetClipboardData(CF_TEXT,hglbCopy);&lt;br /&gt;
&lt;br /&gt;
	//закрываем буфер&lt;br /&gt;
	CloseClipboard();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
2) извлечение из буфера обмена&lt;br /&gt;
&lt;br /&gt;
  1.Проверяем, что поддерживается нужный формат данных,&lt;br /&gt;
      вызывая IsClipboardFormatAvailable()&lt;br /&gt;
  2.Открываем буфер обмена , вызывая OpenClipboard();&lt;br /&gt;
  3.Достаём данные&lt;br /&gt;
   а.Получаем из буфера хендл требуемого формата,&lt;br /&gt;
      вызывая GetClipboardData()&lt;br /&gt;
    б.Получаем указатель на выделенную память, вызывая GlobalLock()&lt;br /&gt;
    в.Работаем с данными&lt;br /&gt;
    г.Освобождаем указатель , вызывая GlobalUnlock();&lt;br /&gt;
  4.Закрываем буфер, вызывая CloseClipboard();&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	//Проверяем, что поддерживается нужный формат данных,&lt;br /&gt;
	if(!IsClipboardFormatAvailable(CF_TEXT))return;&lt;br /&gt;
&lt;br /&gt;
	//открываем буфер обмена&lt;br /&gt;
	OpenClipboard();&lt;br /&gt;
&lt;br /&gt;
	//достаём данные&lt;br /&gt;
&lt;br /&gt;
	//текстовый формат&lt;br /&gt;
	HANDLE hglbCopy = GetClipboardData(CF_TEXT);&lt;br /&gt;
	if(!hglbCopy)return;&lt;br /&gt;
&lt;br /&gt;
	//получаем указатель&lt;br /&gt;
	void* lpStr = GlobalLock(hglbCopy);&lt;br /&gt;
	if(!lpStr)return;&lt;br /&gt;
&lt;br /&gt;
	//читаем данные&lt;br /&gt;
	char data[10];&lt;br /&gt;
	memmove(data,lpStr,sizeof(data));&lt;br /&gt;
&lt;br /&gt;
	//освобождаем указатель&lt;br /&gt;
	GlobalUnlock(hglbCopy);&lt;br /&gt;
	lpStr=0;&lt;br /&gt;
&lt;br /&gt;
	//закрываем буфер&lt;br /&gt;
	CloseClipboard();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как получить полный путь к экзешнику из самой программы ?===&lt;br /&gt;
В командную строку первым параметром система всегда передаёт заключённый в кавычки полный путь к файлу запущенной программы Достаём путь таким образом :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
BOOL CMyApp::InitInstance()&lt;br /&gt;
{&lt;br /&gt;
	//добыча полного имени экзешника&lt;br /&gt;
	CString csFullExeName;&lt;br /&gt;
	{&lt;br /&gt;
		CString csAppName=GetCommandLine();&lt;br /&gt;
		csAppName.Delete(0,1);&lt;br /&gt;
		csAppName.Replace('\&amp;quot;','\0');&lt;br /&gt;
		csFullExeName=(const char*)csAppName;&lt;br /&gt;
	}&lt;br /&gt;
	//теперь csFullExeName - содержит искомый путь&lt;br /&gt;
&lt;br /&gt;
	//...&lt;br /&gt;
	//...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Каким способом можно exe файл может заменить самого себя? То есть, моя программа обновляется, например, через Internet, и хочет обновить свой exe-файл. Но так как он в данный момент запущен - это будет, естественно, запрещено. Как это можно проще всего сделать?===&lt;br /&gt;
Один из способов - сделать копию экзешника и из него обновиться&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define def_exeNAMEup	&amp;quot;c:\\myprog_update.exe&amp;quot;&lt;br /&gt;
#define def_exeNAMEdnld	&amp;quot;c:\\myprog_downloaded.exe&amp;quot;&lt;br /&gt;
#define def_keyUdate	&amp;quot;/update&amp;quot;&lt;br /&gt;
&lt;br /&gt;
void CTESTFAQApp::UpdateItself()&lt;br /&gt;
{&lt;br /&gt;
	//добыча полного имени экзешника&lt;br /&gt;
	CString csFullExeName;&lt;br /&gt;
	{&lt;br /&gt;
		CString csAppName=GetCommandLine();&lt;br /&gt;
		csAppName.Delete(0,1);&lt;br /&gt;
		csAppName.Replace('\&amp;quot;','\0');&lt;br /&gt;
		csFullExeName=(const char*)csAppName;&lt;br /&gt;
	}&lt;br /&gt;
	//теперь csFullExeName - содержит искомый путь&lt;br /&gt;
&lt;br /&gt;
	//делаем копию экзешника с другим именем&lt;br /&gt;
	CopyFile(csFullExeName,def_exeNAMEup,0);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	//передаём в параметры нового процесса ключ и путь к текущему файлу&lt;br /&gt;
	CString csParams=def_keyUdate;&lt;br /&gt;
	csParams+=&amp;quot; &amp;quot;;&lt;br /&gt;
	csParams+=csFullExeName;&lt;br /&gt;
&lt;br /&gt;
	//запускаем копию&lt;br /&gt;
	STARTUPINFO si;&lt;br /&gt;
	PROCESS_INFORMATION pi;&lt;br /&gt;
	ZeroMemory(&amp;amp;si,sizeof(si));&lt;br /&gt;
	si.cb = sizeof(si);&lt;br /&gt;
	ZeroMemory(&amp;amp;pi,sizeof(pi));&lt;br /&gt;
	if(CreateProcess(def_exeNAMEup,def_keyUdate,0,0,0,0,0,0,&amp;amp;si,&amp;amp;pi))&lt;br /&gt;
	{&lt;br /&gt;
		//завершаем текущий процесс&lt;br /&gt;
		ExitFromMyApp();&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void CTESTFAQApp::ExitFromMyApp()&lt;br /&gt;
{&lt;br /&gt;
	exit(0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
BOOL CTESTFAQApp::InitInstance()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
	//смотрим, не запустили ли для апдейта?&lt;br /&gt;
&lt;br /&gt;
	CString txt;&lt;br /&gt;
	txt=m_lpCmdLine;&lt;br /&gt;
	if(txt.Find(def_keyUdate)==0)&lt;br /&gt;
	{&lt;br /&gt;
		//делаем айдейт&lt;br /&gt;
		txt.Replace(def_keyUdate,&amp;quot;&amp;quot;);&lt;br /&gt;
		txt.TrimLeft();&lt;br /&gt;
&lt;br /&gt;
		CString csFullExeName=txt;&lt;br /&gt;
&lt;br /&gt;
		//берём откуда то уже скачанный файл обновления&lt;br /&gt;
		//...&lt;br /&gt;
		CString csFull_Downloaded_ExeName=def_exeNAMEdnld;&lt;br /&gt;
&lt;br /&gt;
		//копируем файл (обновляем старый то есть)&lt;br /&gt;
		CopyFile(csFull_Downloaded_ExeName,csFullExeName,0);&lt;br /&gt;
&lt;br /&gt;
		//запускаем обновлённого мученника&lt;br /&gt;
		STARTUPINFO si;&lt;br /&gt;
		PROCESS_INFORMATION pi;&lt;br /&gt;
		ZeroMemory(&amp;amp;si,sizeof(si));&lt;br /&gt;
		si.cb = sizeof(si);&lt;br /&gt;
		ZeroMemory(&amp;amp;pi,sizeof(pi));&lt;br /&gt;
		if(CreateProcess(csFullExeName,0,0,0,0,0,0,0,&amp;amp;si,&amp;amp;pi))&lt;br /&gt;
&lt;br /&gt;
		ExitFromMyApp();&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
	//...&lt;br /&gt;
	//...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Есть строка символов (страничка из Инета) в кодировке utf-8 (строка char*). Как мне ее получить в формате String&lt;br /&gt;
или в char* в кодировке ANSI (cp 1251) ?===&lt;br /&gt;
Можно перевести строку из UTF8 в Unicode, затем из Unicode в 1251&lt;br /&gt;
&lt;br /&gt;
Ниже приведена структура, содержащая процедуры перекодирования,&lt;br /&gt;
а также процедуру с примером использования&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//описание структуры&lt;br /&gt;
struct coder&lt;br /&gt;
{&lt;br /&gt;
	//utf8-&amp;gt;unicode&lt;br /&gt;
	static wchar_t* utf8_to_unicode__dontForgetDeleteArr(const char *utf8_string)&lt;br /&gt;
	{&lt;br /&gt;
		wchar_t* pRes=0;&lt;br /&gt;
		int res_len=0;&lt;br /&gt;
&lt;br /&gt;
		//тест на возможность преобразования&lt;br /&gt;
		res_len=MultiByteToWideChar(CP_UTF8,0,utf8_string,-1,0,0);&lt;br /&gt;
		if(!res_len)return 0;&lt;br /&gt;
&lt;br /&gt;
		//выделяем память&lt;br /&gt;
		pRes = new wchar_t[res_len];&lt;br /&gt;
		if(!pRes)return 0;&lt;br /&gt;
&lt;br /&gt;
		//преобразование&lt;br /&gt;
		if(!MultiByteToWideChar(CP_UTF8,0,utf8_string,-1,pRes,res_len))&lt;br /&gt;
		{&lt;br /&gt;
			delete [] pRes;&lt;br /&gt;
			return 0;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		return pRes;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	//unicode-&amp;gt;1251&lt;br /&gt;
	static char * unicode_to_1251__dontForgetDeleteArr(const wchar_t *unicode_string)&lt;br /&gt;
	{&lt;br /&gt;
		char* pRes=0;&lt;br /&gt;
		int res_len=0;&lt;br /&gt;
&lt;br /&gt;
		//тест на возможность преобразования&lt;br /&gt;
		res_len = WideCharToMultiByte(1251,0,unicode_string,-1,0,0,0,0);&lt;br /&gt;
		if(!res_len)return 0;&lt;br /&gt;
&lt;br /&gt;
		//выделяем память&lt;br /&gt;
		pRes=new char[res_len];&lt;br /&gt;
		if(!pRes)return 0;&lt;br /&gt;
&lt;br /&gt;
		//преобразование&lt;br /&gt;
		if(!WideCharToMultiByte(1251,0,unicode_string,-1,pRes,res_len,0,0))&lt;br /&gt;
		{&lt;br /&gt;
			delete [] pRes;&lt;br /&gt;
			return 0;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		return pRes;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	//процедура с примером&lt;br /&gt;
	static void Example()&lt;br /&gt;
	{&lt;br /&gt;
		wchar_t* unicode_string=0;&lt;br /&gt;
		char* cp1251_string=0;&lt;br /&gt;
&lt;br /&gt;
		//исходный текст&lt;br /&gt;
		char utf8_string[] = &amp;quot;UTF-8 + СЂСѓСЃСЃРєРёР№ С‚РµРєСЃС‚&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
		for(;;)&lt;br /&gt;
		{&lt;br /&gt;
&lt;br /&gt;
			unicode_string=utf8_to_unicode__dontForgetDeleteArr(utf8_string);&lt;br /&gt;
			if(!unicode_string)&lt;br /&gt;
			{&lt;br /&gt;
				AfxMessageBox(&amp;quot;Не удалось конвертировать в unicode!&amp;quot;);&lt;br /&gt;
				break;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			cp1251_string = unicode_to_1251__dontForgetDeleteArr(unicode_string);&lt;br /&gt;
&lt;br /&gt;
			if(!cp1251_string)&lt;br /&gt;
			{&lt;br /&gt;
				AfxMessageBox(&amp;quot;Не удалось конвертировать из unicode!&amp;quot;);&lt;br /&gt;
				break;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			break;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		//cp1251_string - результат&lt;br /&gt;
		AfxMessageBox(cp1251_string);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
		//не забываем удалить массивы&lt;br /&gt;
		if(unicode_string)&lt;br /&gt;
		{&lt;br /&gt;
			delete [] unicode_string;&lt;br /&gt;
			unicode_string=0;&lt;br /&gt;
		}&lt;br /&gt;
		if(cp1251_string)&lt;br /&gt;
		{&lt;br /&gt;
			delete [] cp1251_string;&lt;br /&gt;
			cp1251_string=0;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
//вызов примера&lt;br /&gt;
coder::Example();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как организовать взаимодействие программы на VC.net с Access-овской базой данных?===&lt;br /&gt;
Проще всего подключить ADO компоненты и сделать все на них.&lt;br /&gt;
Компоненты  ADO (ADODC,DATAGRID и т.п.) это ActiveX.&lt;br /&gt;
В редакторе ресурсов, во всплывающем меню, есть Insert ActiveX Control -&amp;gt; открывается список всех компоент,&lt;br /&gt;
зарегистрированых на машине. Нужно найти компоненты (Это компоненты от MS и они помечены (OLEDB)) и вставить их в диалог. Для того что бы иметь возможность управлять ими, нужно импортировать обертки для них, это делается при помощи ClassWisard, там есть импорт-&amp;gt;класс-&amp;gt;указать файл с компоентой (OSX).&lt;br /&gt;
Появляется список всех классов, объявленых внутри.&lt;br /&gt;
Проставляем галочки, нажимаем ОК.&lt;br /&gt;
&lt;br /&gt;
[[Category:FAQ]]&lt;/div&gt;</summary>
		<author><name>Mczim</name></author>	</entry>

	<entry>
		<id>https://wiki.shelek.ru/index.php?title=FAQ:WinAPI,_VCPP_Part_3&amp;diff=417</id>
		<title>FAQ:WinAPI, VCPP Part 3</title>
		<link rel="alternate" type="text/html" href="https://wiki.shelek.ru/index.php?title=FAQ:WinAPI,_VCPP_Part_3&amp;diff=417"/>
				<updated>2008-08-14T18:54:16Z</updated>
		
		<summary type="html">&lt;p&gt;Mczim: пробел перед знаком вопроса в заголовке + пробел перед запятыми тоже в заголовке&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Имеется приложение на основе CRichEditView. Как узнать, что пользователь меняет текст?===&lt;br /&gt;
Добавить обработчик сообщения EN_CHANGE. Сообщение генерируется CRichEditView каждый раз, когда пользователь изменяет текст в окне CRichEditView&lt;br /&gt;
===Чем метод CArray::GetSize отличается от метода CArray::GetCount?===&lt;br /&gt;
Абсолютно ничем. (Скорее всего, были предыдущие библиотеки, в которых функции, одинаковые по смыслу, имели разные имена. Поэтому в целях совместимости оставили оба)&lt;br /&gt;
===Как загрузить строку из ресурса?===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CString m_Temp;&lt;br /&gt;
m_Temp.LoadString(ID_MYSTRING);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как поменять иконку у элемента (item) в CListCtrl?===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//заполняем структуру LVITEM&lt;br /&gt;
LVITEM lvItem;&lt;br /&gt;
memset(&amp;amp;lvItem,0,sizeof(lvItem));&lt;br /&gt;
	&lt;br /&gt;
lvItem.mask = LVIF_IMAGE;//меняться будет картинка&lt;br /&gt;
lvItem.iItem = ...;// индекс элемента списка (Zero-based)&lt;br /&gt;
lvItem.iSubItem = 0;&lt;br /&gt;
lvItem.iImage = ...; //индекс иконки (из списка контрола)&lt;br /&gt;
	&lt;br /&gt;
pList-&amp;gt;SetItem(&amp;amp; lvItem);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Имеется класс Class1, содержащий мембер типа указатель на Class2. В Class2 также имеется указатель на Class1. Компилятор выдаёт ошибку. Что надо делать?===&lt;br /&gt;
Предварительно объявляем класс Class2. Тогда компилятору будет известно, что описание класса Class2 будет встречено дальше, и станет возможным объявление указателей на класс до описания самого класса.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Class2;//предопределение&lt;br /&gt;
	&lt;br /&gt;
Class1&lt;br /&gt;
{&lt;br /&gt;
	Class2* p;&lt;br /&gt;
};&lt;br /&gt;
	&lt;br /&gt;
Class2&lt;br /&gt;
{&lt;br /&gt;
	Class1* p;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как переключить раскладку в другом (то есть в активном) процессе?===&lt;br /&gt;
Использовать функции:&lt;br /&gt;
   GetKeyboardLayout - определить текущую раскладку&lt;br /&gt;
   LoadKeyboardLayout - загрузить новую раскладку&lt;br /&gt;
&lt;br /&gt;
см.также&lt;br /&gt;
   VerLanguageName - получить строку с описанием языка&lt;br /&gt;
&lt;br /&gt;
(подробности - в MSDN)&lt;br /&gt;
===Как получить хендл контрола Edit зная его ID?===&lt;br /&gt;
Пусть контрол лежит на окне CMyWnd&lt;br /&gt;
Тогда:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void CMyWnd::некая_процедура()&lt;br /&gt;
{&lt;br /&gt;
	//для MFC&lt;br /&gt;
	CEdit* ed=(CEdit* ) GetDlgItem(ID_EDIT1);&lt;br /&gt;
	HWND hwnd=ed-&amp;gt;GetSafeHwnd();&lt;br /&gt;
	...&lt;br /&gt;
	&lt;br /&gt;
	//для Win32 API&lt;br /&gt;
	HWND hwnd=GetDlgItem(m_hWnd,ID_EDIT1);&lt;br /&gt;
	...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Как из дочернего окна закрыть приложение?===&lt;br /&gt;
Нужно послать родительскому окну (*pParent) сообщение WM_CLOSE:&lt;br /&gt;
 pParent-&amp;gt;PostMessage(WM_CLOSE);//MFC&lt;br /&gt;
или&lt;br /&gt;
 ::PostMessage(pParent-&amp;gt;m_hWnd,WM_CLOSE,(WPARAM)0,(LPARAM)0);//API&lt;br /&gt;
===Как корректно перевести BSTR в CString и наоборот?===&lt;br /&gt;
Нужно просто присвоить переменной типа CString переменную типа BSTR.&lt;br /&gt;
Оператор = класса CString сам всё переведёт.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//указатель на будущий буфер с BSTR.&lt;br /&gt;
//	(По сути, BSTR определён как &lt;br /&gt;
//	typedef WCHAR* BSTR;&lt;br /&gt;
//	то есть указатель на 16-битный символ юникод)&lt;br /&gt;
	&lt;br /&gt;
BSTR bstrHE=0;&lt;br /&gt;
	&lt;br /&gt;
CString Str=&amp;quot;мой текст&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
//Выделить память и загрузить адрес блока в bstrHE&lt;br /&gt;
bstrHE=Str.AllocSysString();&lt;br /&gt;
	&lt;br /&gt;
//...	&lt;br /&gt;
//тут работаем с bstrHE[]&lt;br /&gt;
//...&lt;br /&gt;
	&lt;br /&gt;
//освобождаем память&lt;br /&gt;
SysFreeString(bstrHE);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Как получить доступ к графическим ресурсам элементов текущей темы оформления Windows?===&lt;br /&gt;
Использовать функции&lt;br /&gt;
&lt;br /&gt;
OpenThemeData()&lt;br /&gt;
DrawThemeBackground()&lt;br /&gt;
DrawFrameControl()&lt;br /&gt;
CloseThemeData().&lt;br /&gt;
&lt;br /&gt;
(подробности - в MSDN)&lt;br /&gt;
===Имеется класс , производный от CDialog. Когда диалог в фокусе, нажатие на Enter или Esc приводит к закрытию диалога. Как это запретить?===&lt;br /&gt;
При нажатии Enter происходит выполнение команды IDOK,&lt;br /&gt;
при нажатии Esc - IDCANCEL.&lt;br /&gt;
Нужно переопределить в классе виртуальные функции OnOk() и OnCancel(),&lt;br /&gt;
которые соответственно вызываются для этих команд. При помощи&lt;br /&gt;
визарда эти функции добавить можно так: Положить на диалог две кнопки&lt;br /&gt;
с идентификаторами IDOK и IDCANCEL (при создании нового диалога они там&lt;br /&gt;
есть сразу), затем двойной клик по кнопке добавляет соответствующий&lt;br /&gt;
обработчик. В обработчиках надо удалить вызовы СDialog::OnOK() и&lt;br /&gt;
CDialog::OnCancel(), тогда диалог закрываться не будет.&lt;br /&gt;
Однако тогда диалог станет невозможно закрыть кнопкой с крестиком  :)&lt;br /&gt;
&lt;br /&gt;
Лечить так: добавить обработчик сообщения WM_CLOSE - OnClose(), и в нём&lt;br /&gt;
сделать вызов OnOk() или OnCancel() :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void CPlayersPropsDialog::OnClose() &lt;br /&gt;
{&lt;br /&gt;
	CDialog::OnClose();&lt;br /&gt;
	CDialog::OnCancel();//добавлено&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===VC++6. Я написал простейший макрос, а компилятор на него ругается. Ума не приложу, что за глюк?===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	#define my_macr(x,y,z) \&lt;br /&gt;
		z=\&lt;br /&gt;
		(x+y)*\&lt;br /&gt;
		(x-y)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Скорее всего после одного из символов соединения строк &amp;quot;\&amp;quot; имеется&lt;br /&gt;
пробел или табуляция. Их надо удалить. Можно найти их &amp;quot;наощупь&amp;quot;, а&lt;br /&gt;
можно включить показ непечатных символов в студии. Найти эту команду&lt;br /&gt;
можно так:&lt;br /&gt;
Tools-&amp;gt;Customize...-&amp;gt;вкладка Commands. В окошке Category выбрать&lt;br /&gt;
&amp;quot;Edit&amp;quot;, и среди кнопок справа найти кнопку, на которой написано &amp;quot;a.b&amp;quot;&lt;br /&gt;
Эту кнопку надо перетащить на одну из панелей инструментов студии.&lt;br /&gt;
&lt;br /&gt;
===Как получить список всех процесов, включая idle?===&lt;br /&gt;
Использовать функции&lt;br /&gt;
Process32First()&lt;br /&gt;
Precess32Next()&lt;br /&gt;
&lt;br /&gt;
===Как программно установить переменные окружения?===&lt;br /&gt;
Чтобы добавить или изменить их программно, необходимо воспользоваться&lt;br /&gt;
ключом реестра HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\&lt;br /&gt;
Session Manager\Environment, а затем отправить широковещательное&lt;br /&gt;
сообщение WM_SETTINGCHANGE. Это позволит приложениям узнать об&lt;br /&gt;
изменениях:&lt;br /&gt;
&lt;br /&gt;
::SendMessage(HWND_BROADCAST,WM_SETTINGCHANGE,0,0);&lt;br /&gt;
===Как сделать, чтобы у окна был черный фон?===&lt;br /&gt;
переопределить обработчик сообщения WM_CTLCOLOR - OnCtlColor() :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CBrush br(RGB(0,0,0));&lt;br /&gt;
	&lt;br /&gt;
HBRUSH CMyDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) &lt;br /&gt;
{&lt;br /&gt;
	HBRUSH hbr = CMyDlg::OnCtlColor(pDC, pWnd, nCtlColor);&lt;br /&gt;
	&lt;br /&gt;
	//фон диалога (или вьюшки)&lt;br /&gt;
	if(nCtlColor==CTLCOLOR_DLG)&lt;br /&gt;
	{&lt;br /&gt;
		return (HBRUSH)br;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	//фон статиков (если нужно)&lt;br /&gt;
	if(nCtlColor==CTLCOLOR_STATIC)&lt;br /&gt;
	{&lt;br /&gt;
		//делаем фон текста статика прозрачным&lt;br /&gt;
		pDC-&amp;gt;SetBkMode(TRANSPARENT);&lt;br /&gt;
		return (HBRUSH)br;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	return hbr;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Почему на моем компьютере экзешник, созданный в MFC запускается, а на других компьютерах - нет? Требует какую-то  dll-ку.===&lt;br /&gt;
Нужно выбирать режим Release :&lt;br /&gt;
&lt;br /&gt;
Menu-&amp;gt;Build-&amp;gt;Configurations...-&amp;gt;Release,&lt;br /&gt;
&lt;br /&gt;
и экзешник, соответственно, брать из папки Release проекта&lt;br /&gt;
===Как в диалог добавить меню?===&lt;br /&gt;
Надо сделать в ресурсах меню, затем вставить в диалог:&lt;br /&gt;
&lt;br /&gt;
открыть в редакторе диалог, в свойствах (во вкладке General, окошко Menu) указать идентивикатор ресурса меню.&lt;br /&gt;
При помощи визарда добавить для меню обработчики OnCommand() и OnUpdateСommand().&lt;br /&gt;
===Я добавил визардом меню в диалог. Добавил обработчики для пунктов меню. Пункты работают, но OnUpdate для пунктов не вызывается - то есть не получается ни затенить, ни чек поставить. Что делать?===&lt;br /&gt;
В диалоге у меню апдейта не происходит сам, в отличие от мейнфрейма.&lt;br /&gt;
Для этого нужно сделать самим апдейт в обработчике сообщения WM_KICKIDLE.&lt;br /&gt;
Визардом обработчик не добавляется, поэтому можно переопределить виртуальную DefWindowProc() и там обработать:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;afxpriv.h&amp;gt;	//этот файл надо включить, там определёна WM_KICKIDLE&lt;br /&gt;
&lt;br /&gt;
LRESULT CMyDialog::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam) &lt;br /&gt;
{&lt;br /&gt;
	if(message==WM_KICKIDLE)&lt;br /&gt;
	{&lt;br /&gt;
		//делаем апдейт для всех пунктов меню&lt;br /&gt;
		CMenu* pMainMenu=GetMenu();&lt;br /&gt;
		if(pMainMenu)&lt;br /&gt;
		{&lt;br /&gt;
			CCmdUI cmdUI;&lt;br /&gt;
			for (UINT n=0; n &amp;lt; pMainMenu-&amp;gt;GetMenuItemCount(); ++n)&lt;br /&gt;
			{&lt;br /&gt;
				CMenu* pSubMenu = pMainMenu-&amp;gt;GetSubMenu(n);&lt;br /&gt;
				if(!pSubMenu)continue;&lt;br /&gt;
	&lt;br /&gt;
				cmdUI.m_nIndexMax = pSubMenu-&amp;gt;GetMenuItemCount();&lt;br /&gt;
				for (UINT i = 0; i &amp;lt; cmdUI.m_nIndexMax;++i)&lt;br /&gt;
				{&lt;br /&gt;
					cmdUI.m_nIndex = i;&lt;br /&gt;
					cmdUI.m_nID = pSubMenu-&amp;gt;GetMenuItemID(i);&lt;br /&gt;
					cmdUI.m_pMenu = pSubMenu;&lt;br /&gt;
					cmdUI.DoUpdate(this, FALSE);&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	return CDialog::DefWindowProc(message, wParam, lParam);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Как на Visual C++ 6.0 в Главном окне отключить системное меню (в левом верхнем углу) и кнопки(в правом верхнем углу)?===&lt;br /&gt;
При создании окна нужно убрать стиль WS_SYSMENU&lt;br /&gt;
(теперь пользователь корректно может закрыть окно только Alt+F4,&lt;br /&gt;
ну или если вы предоставите ему дополнительную возможность сделать это)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пример 1. (для SDI, MDI)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//этот обработчик уже добавлен визардом&lt;br /&gt;
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT&amp;amp; cs)&lt;br /&gt;
{&lt;br /&gt;
	if( !CFrameWnd::PreCreateWindow(cs) )&lt;br /&gt;
		return FALSE;&lt;br /&gt;
	// TODO: Modify the Window class or styles here by modifying&lt;br /&gt;
	//  the CREATESTRUCT cs&lt;br /&gt;
&lt;br /&gt;
	///////////////////////////////&lt;br /&gt;
	//добавленная часть&lt;br /&gt;
	{&lt;br /&gt;
		//убираем стиль&lt;br /&gt;
		cs.style&amp;amp;=~WS_SYSMENU;&lt;br /&gt;
	}&lt;br /&gt;
	///////////////////////////////&lt;br /&gt;
&lt;br /&gt;
	return TRUE;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Пример 2. (для диалога)&lt;br /&gt;
Если диалог описан в ресурсах, то в свойствах диалога убрать галочки&lt;br /&gt;
  &amp;quot;System menu&amp;quot;&lt;br /&gt;
  &amp;quot;Minimize box&amp;quot;&lt;br /&gt;
  &amp;quot;Maximize box&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===Хочу сделать так, чтобы пользователь не мог нажать на кнопку, пока программа не разрешит.===&lt;br /&gt;
Нужно применить метод класса CWnd::EnableWindow(...) для кнопки.&lt;br /&gt;
Значение параметра 0 делает кнопку неактивной, 1 - делает активной.&lt;br /&gt;
(кстате, не только для кнопки можно, а для любого класса, производного&lt;br /&gt;
от класса CWnd)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пусть имеется некий диалог, на нём лежит кнопка c ID == IDC_1.&lt;br /&gt;
в любом месте кода диалога (кроме конструктора и деструктора , хотя, если&lt;br /&gt;
проверить наличие валидного хендла диалога, как в примере, то ничего&lt;br /&gt;
страшного не будет и там)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//делаем кнопку неактивной&lt;br /&gt;
if(m_hWnd)&lt;br /&gt;
{&lt;br /&gt;
	CWnd* pw=0;&lt;br /&gt;
	pw=GetDlgItem(IDC_1);&lt;br /&gt;
	if(pw)pw-&amp;gt;EnableWindow(0);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Что означают сообщения, которые студия выводит при компиляции, вроде таких : Loaded 'C:\WINDOWS\SYSTEM\WSOCK32.DLL', no matching symbolic information found. ===&lt;br /&gt;
Это строка говорит о том, что студия не смогла найти отладочные&lt;br /&gt;
символы для WSOCK32.DLL. В этом нет ничего страшного, просто при наличии&lt;br /&gt;
отладочных символов в процессе отладки можно получить доступ к именам&lt;br /&gt;
функции из системных DLL. Например, вместо&lt;br /&gt;
 KERNEL32! 0x77E8B184() -&lt;br /&gt;
 увидим&lt;br /&gt;
 KERNEL32!CreateThread.&lt;br /&gt;
===Как обработать сообщения, которое приходит к некому контролу (скажем CEdit)?===&lt;br /&gt;
Нужно произвести от CEdit свой класс, и в виртуальной процедуре класса WindowProc перехватить нужные сообщения.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
virtual LRESULT WindowProc(&lt;br /&gt;
   UINT message,&lt;br /&gt;
   WPARAM wParam,&lt;br /&gt;
   LPARAM lParam &lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Пример. Полностью выключаем, скажем, обработку сообщения WM_CHAR&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	LRESULT CMyEdit::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) &lt;br /&gt;
	{&lt;br /&gt;
		switch(message)&lt;br /&gt;
		{&lt;br /&gt;
			case WM_CHAR:&lt;br /&gt;
			{&lt;br /&gt;
				return 0;&lt;br /&gt;
			}&lt;br /&gt;
			break;&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		return CEdit::WindowProc(message, wParam, lParam);&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Чтобы связать экземпляр класса с контролом на форме, добавьте визардом для&lt;br /&gt;
контрола переменную класса (выбрав не Value а Control).&lt;br /&gt;
&lt;br /&gt;
===Как настроить количество пробелов в табуляции?===&lt;br /&gt;
Tools-&amp;gt;Options-&amp;gt;Tabs-&amp;gt;Insert Spaces&lt;br /&gt;
(или  правой кнопкой мыши по тексту-&amp;gt; properties)&lt;br /&gt;
===Как автоматически расставить отступы?===&lt;br /&gt;
Выделить текст для форматирования, нажать Alt+F8&lt;br /&gt;
&lt;br /&gt;
Есть ещё программа Artistic Style, которая занимается&lt;br /&gt;
переформатированием кода&lt;br /&gt;
http://sourceforge.net/projects/astyle/&lt;br /&gt;
===Поиск границ блока===&lt;br /&gt;
&amp;quot;CTRL+ }&amp;quot; ищет парную фигурную скобку в тексте и переходит на неё&lt;br /&gt;
===Вертикальное выделение текста===&lt;br /&gt;
&amp;quot;Alt + выделение мышкой&amp;quot; - позволяет выделять вертикальные фрагменты текста&lt;br /&gt;
===Как узнать количество установленных в CListCtrl столбцов?===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CListCtrl* pL=...; //указатель на переменную-контрол&lt;br /&gt;
&lt;br /&gt;
int count=pL-&amp;gt;GetHeaderCtrl()-&amp;gt;GetItemCount();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Как получить иконку приложения?===&lt;br /&gt;
Если приложение запущено, то нужно найти его главное окно и&lt;br /&gt;
послать ему сообщение WM_GETICON.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//функция возвращант хендл иконки &lt;br /&gt;
LRESULT SendMessage(hWnd, WM_GETICON, wParam, 0);&lt;br /&gt;
&lt;br /&gt;
//hWnd == хендл окна приложения&lt;br /&gt;
//wParam == &lt;br /&gt;
//	1)==ICON_BIG - получить большую иконку&lt;br /&gt;
//	2)==ICON_SMALL - получить маленькую иконку&lt;br /&gt;
//	3)==ICON_SMALL2 - получить маленькую иконку, если она определена&lt;br /&gt;
//				в приложении. Если её нет, то маленькую иконку, &lt;br /&gt;
//				сгенерированную системой из большой иконки&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как в CString можно найти или вырезать часть строки?===&lt;br /&gt;
есть такие методы в CString:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//вырезает кусок строки&lt;br /&gt;
CString Mid(int nFirst) const;&lt;br /&gt;
CString Mid(int nFirst,  int nCount) const;&lt;br /&gt;
&lt;br /&gt;
//возвращает кусок строки (сначала или с конца)&lt;br /&gt;
CString Left(int nCount ) const;&lt;br /&gt;
CString Right(int nCount ) const;&lt;br /&gt;
&lt;br /&gt;
//возвращает начальный кусок строки, в котором есть только&lt;br /&gt;
//символы из набора,представленного в lpszCharSet&lt;br /&gt;
CString SpanIncluding(LPCTSTR lpszCharSet ) const;&lt;br /&gt;
&lt;br /&gt;
//возвращает начальный кусок строки, в котором нет&lt;br /&gt;
//символов из набора,представленного в lpszCharSet&lt;br /&gt;
CString SpanExcluding(LPCTSTR lpszCharSet ) const; &lt;br /&gt;
&lt;br /&gt;
//убирает &amp;quot;пробелоподобные&amp;quot; символы из самого начала строки&lt;br /&gt;
//(то есть - пробел, табуляцию (\t) , возврат каретки, перевод строки (/r/n))&lt;br /&gt;
void TrimLeft();&lt;br /&gt;
//убирает все повторы символа из самого начала строки&lt;br /&gt;
void TrimLeft(TCHAR chTarget );&lt;br /&gt;
//убирает из самого начала строки все символа из набора lpszTargets &lt;br /&gt;
void TrimLeft(LPCTSTR lpszTargets ); &lt;br /&gt;
&lt;br /&gt;
void TrimRight();&lt;br /&gt;
void TrimRight(TCHAR chTarget );&lt;br /&gt;
void TrimRight(LPCTSTR lpszTargets ); &lt;br /&gt;
&lt;br /&gt;
//поиск в строке&lt;br /&gt;
int Find( TCHAR ch ) const;&lt;br /&gt;
int Find( LPCTSTR lpszSub ) const;&lt;br /&gt;
int Find( TCHAR ch, int nStart ) const;&lt;br /&gt;
int Find( LPCTSTR pstr, int nStart ) const;&lt;br /&gt;
&lt;br /&gt;
//поиск, начиная с конца&lt;br /&gt;
int ReverseFind( TCHAR ch ) const;&lt;br /&gt;
&lt;br /&gt;
//поиск позиции первого символа, одного из набора,&lt;br /&gt;
// представленного в lpszCharSet&lt;br /&gt;
int FindOneOf( LPCTSTR lpszCharSet ) const;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Есть у меня CListBox и я в ходе выполнения программы добавляю в него строки. Но я не могу посмотреть что именно добавляется. Вывод результатов происходит в конце выполнения процедуры...===&lt;br /&gt;
Если нужно делать принудительную перерисовку окна во время&lt;br /&gt;
длительных вычислений, то нужно вызывать для окна, которое&lt;br /&gt;
надо перерисовать метод&lt;br /&gt;
  RedrawWindow()&lt;br /&gt;
с параметрами по умолчанию, или пару&lt;br /&gt;
  Invalidate(0);&lt;br /&gt;
  UpdateWindow();&lt;br /&gt;
Это приводит к пометке всего окна к перерисовке и отправлению&lt;br /&gt;
сообщения WM_PAINT в оконную процедуру в обход очереди&lt;br /&gt;
сообщений, вызывая немедленную перерисовку окна.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CWnd* pw=...;//окно, которое надо перерисовывать&lt;br /&gt;
&lt;br /&gt;
for(int i=0;i&amp;lt;10000)&lt;br /&gt;
{&lt;br /&gt;
	//меняется содержимое окна&lt;br /&gt;
	//...&lt;br /&gt;
&lt;br /&gt;
	//немедленная перерисовка&lt;br /&gt;
	pw-&amp;gt;Invalidate(0);&lt;br /&gt;
	pw-&amp;gt;UpdateWindow();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Я написал DLL, которую используют несколько приложений. Всё вроде работает, но когда происходит очередной вызов функции из DLL, почему то данные в функции обнуляются. С чем это связано?===&lt;br /&gt;
Переменные и массивы в DLL, содержимое которых должно использоваться несколькими процессами, должны объявляться статическими. Статическая переменная или массив инициализируются только один раз в момент загрузки DLL.&lt;br /&gt;
Пример:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DWORD calltest()&lt;br /&gt;
{&lt;br /&gt;
	//будет выполнено только при первом вызове&lt;br /&gt;
	static DWORD callcount=0;&lt;br /&gt;
	static DWORD str[1000]={0}; &lt;br /&gt;
&lt;br /&gt;
	//будет выполняться каждый раз&lt;br /&gt;
	return ++callcount;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Как открыть проекцию файла в память и как с ней работать?===&lt;br /&gt;
Как открыть проекцию файла в память и как с ней работать?&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HANDLE CreateFileMapping(&lt;br /&gt;
  HANDLE hFile,	//хендл уже открытого файла&lt;br /&gt;
  LPSECURITY_ATTRIBUTES lpAttributes,&lt;br /&gt;
  DWORD flProtect,	//способ открытия проекции&lt;br /&gt;
  DWORD dwMaximumSizeHigh,	//размер файла (старшие 4 байта , обычно==0)&lt;br /&gt;
  DWORD dwMaximumSizeLow,	//размер файла (младшие 4 байта)&lt;br /&gt;
  LPCTSTR lpName&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Доступ к созданной проекции производится процедурой&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LPVOID MapViewOfFile(&lt;br /&gt;
  HANDLE hFileMappingObject, //хендл проекции&lt;br /&gt;
  DWORD dwDesiredAccess,	//способ работы с проекцией&lt;br /&gt;
  DWORD dwFileOffsetHigh,&lt;br /&gt;
  DWORD dwFileOffsetLow, //смещение от начала файла (младшие 4 байта)&lt;br /&gt;
  SIZE_T dwNumberOfBytesToMap //длина в байтах (если ==0 - то весь файл)&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
далее с файлом можно работать как с обычным массивом в памяти.&lt;br /&gt;
&lt;br /&gt;
После работы с проекцией , её надо освободить процедурой&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
BOOL UnmapViewOfFile(&lt;br /&gt;
  LPCVOID lpBaseAddress //адрес, который вернула процедура MapViewOfFile&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Пример.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HANDLE hMapFile=0;//для проекции&lt;br /&gt;
&lt;br /&gt;
HANDLE hFile=...;//хендл уже открытого файла&lt;br /&gt;
DWORD dwdFileLen=...;//размер открытого файла&lt;br /&gt;
&lt;br /&gt;
//создаём проекцию &amp;quot;только для чтения&amp;quot;&lt;br /&gt;
hMapFile=::CreateFileMapping(hFile,0,PAGE_READONLY,0,dwdFileLen,0);&lt;br /&gt;
&lt;br /&gt;
//хендл hFile можно закрыть уже здесь, в принципе,&lt;br /&gt;
//но мы сделаем это позже&lt;br /&gt;
&lt;br /&gt;
//получаем доступ к проекции (тоже только для чтения)&lt;br /&gt;
BYTE* pbyFile=(BYTE*)::MapViewOfFile(hMapFile,FILE_MAP_READ,0,0,0);&lt;br /&gt;
&lt;br /&gt;
///////////////////&lt;br /&gt;
//тут работаем с массивом pbyFile[dwdFileLen] как с обычным,&lt;br /&gt;
//только не забываем, что он открыт только для чтения&lt;br /&gt;
//...&lt;br /&gt;
//...&lt;br /&gt;
//...&lt;br /&gt;
///////////////////&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//отключаем файл данных от адресного пространства&lt;br /&gt;
UnmapViewOfFile(pbyFile);&lt;br /&gt;
&lt;br /&gt;
//освобождаем хендл проекции&lt;br /&gt;
CloseHandle(hMapFile)&lt;br /&gt;
&lt;br /&gt;
//освобождаем хендл открытого файла&lt;br /&gt;
CloseHandle(hFile);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Использую MFC Grid control 2.25 , не получается отобразить картинку в ячейке. Как это делается ?===&lt;br /&gt;
Нужно создать список изображений (CImageList) , затем передать указатель на список в контрол. Поскольку контрол лишь копирует указатель , список должен создаваться динамически, либо быть членом класса, экземпляр которого существует всё время работы контрола.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 m_GridMarket&lt;br /&gt;
CImageList m_ImageList;&lt;br /&gt;
CGridCtrL m_Grid1&lt;br /&gt;
...&lt;br /&gt;
...&lt;br /&gt;
//неким образом создаётся список&lt;br /&gt;
m_ImageList.Create(...);&lt;br /&gt;
//...&lt;br /&gt;
&lt;br /&gt;
//вставляем в контрол&lt;br /&gt;
m_Grid1.SetImageList(&amp;amp;m_ImageList);&lt;br /&gt;
&lt;br /&gt;
//&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как при помощи IPicture отобразить картинку из файла? ===&lt;br /&gt;
Пример - несложная функция, отображающая картинку из файла&lt;br /&gt;
&lt;br /&gt;
поддерживаются форматы&lt;br /&gt;
BMP, GIF, JPEG, PNG, TIFF, EMF&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;quot;atlconv.h&amp;quot;&lt;br /&gt;
#define HandleIsValid(H) (H!=(HANDLE)-1 &amp;amp;&amp;amp; H!=(HANDLE)0)&lt;br /&gt;
&lt;br /&gt;
//*pDestDC - CDC, на который предполагается вывод картинки&lt;br /&gt;
//pchzFilePath - путь к файлу&lt;br /&gt;
//pWid - (возвращает) ширина картинки&lt;br /&gt;
//pHig - (возвращает) высота картинки&lt;br /&gt;
bool DrawBitmapFromFile(CDC* pDestDC,const char* pchzFilePath,int *pWid=0,int *pHig=0)&lt;br /&gt;
{&lt;br /&gt;
	bool result=false;&lt;br /&gt;
&lt;br /&gt;
	if(pWid)*pWid=0;&lt;br /&gt;
	if(pHig)*pHig=0;&lt;br /&gt;
&lt;br /&gt;
	int Wid=0;&lt;br /&gt;
	int Hig=0;&lt;br /&gt;
&lt;br /&gt;
	IPicture* pPic=0;&lt;br /&gt;
	try&lt;br /&gt;
	{&lt;br /&gt;
		IPicture* ptmpPic=0;&lt;br /&gt;
		USES_CONVERSION;&lt;br /&gt;
		HRESULT hr;&lt;br /&gt;
&lt;br /&gt;
		CString txt=pchzFilePath;&lt;br /&gt;
		hr= ::OleLoadPicturePath(&lt;br /&gt;
			const_cast&amp;lt;LPOLESTR&amp;gt;(T2COLE(txt)),&lt;br /&gt;
			0,0,0,IID_IPicture,&lt;br /&gt;
			reinterpret_cast&amp;lt;void **&amp;gt;(&amp;amp;ptmpPic)&lt;br /&gt;
			);&lt;br /&gt;
&lt;br /&gt;
		if(hr==S_OK &amp;amp;&amp;amp; ptmpPic)&lt;br /&gt;
		{&lt;br /&gt;
			pPic=ptmpPic;&lt;br /&gt;
		}&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			throw 0;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		OLE_XPOS_HIMETRIC cxSrc;&lt;br /&gt;
		OLE_YPOS_HIMETRIC cySrc;&lt;br /&gt;
&lt;br /&gt;
		if(S_OK!=pPic-&amp;gt;get_Width(&amp;amp;cxSrc))throw 0;&lt;br /&gt;
		if(S_OK!=pPic-&amp;gt;get_Height(&amp;amp;cySrc))throw 0;&lt;br /&gt;
&lt;br /&gt;
		Wid=cxSrc/26;&lt;br /&gt;
		Hig=cySrc/26;&lt;br /&gt;
&lt;br /&gt;
		//рисуем&lt;br /&gt;
		if(S_OK !=pPic-&amp;gt;Render(pDestDC-&amp;gt;GetSafeHdc(),&lt;br /&gt;
			0,Hig,Wid,-Hig,0,0,cxSrc,cySrc,0))throw 0;&lt;br /&gt;
	}&lt;br /&gt;
	catch(...)&lt;br /&gt;
	{&lt;br /&gt;
		result=false;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if(pPic)&lt;br /&gt;
	{&lt;br /&gt;
		pPic-&amp;gt;Release();&lt;br /&gt;
		pPic=0;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	if(pWid)*pWid=Wid;&lt;br /&gt;
	if(pHig)*pHig=Hig;&lt;br /&gt;
&lt;br /&gt;
	return result;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===У меня модальное диалоговое окно, в нем поле редактирования мультилайновое, т.е. чтобы перейти на новую строку надо нажать ентер, но вызывается стандартный обработчик диалогового окна. Подскажите, что делать?===&lt;br /&gt;
Нужно в редакторе ресурсов поставить для CEdit окошка галочку&lt;br /&gt;
свойства WantReturn,&lt;br /&gt;
&lt;br /&gt;
или добавить ES_WANTRETURN при создании CEdit контрола динамически.&lt;br /&gt;
===Как выводят картинку-логотип(splash screen) при запуске программы? То есть, когда загружается программа на экран выводится картинка, потом она исчезает(загрузка программы закончена) и пользователь может приступать к работе ===&lt;br /&gt;
Для этого используется класс, производный от CDialog. Этот диалог после создания показывает себя на экран, выводя на себя рисунок. Также запускает таймет, по срабатывани которого диалог гасится. Создаётся диалог InitInstance приложения.&lt;br /&gt;
&lt;br /&gt;
В VC6++ также есть уже готовый компонент&lt;br /&gt;
Project-&amp;gt;Add To Project -&amp;gt; Components and Controls-&amp;gt;(в папке &amp;quot;Visual C++ Components&amp;quot; есть SplashScreen.)&lt;br /&gt;
===Как сделать, чтобы при выпадении списка у ComboBox была не одна строка, а больше, вроде все свойства покрутил, не помогает Вместо выпадающего списка одна строка и скролл...===&lt;br /&gt;
В редакторе ресурсов надо щелкнуть в комбобоксе на треугольнике - появляется рамка для растягивания вниз - размер выпадающего списка.&lt;br /&gt;
===В VC++.net , что делать после того, как на форму установил ActiiveX ListView, как объявить класс и переменную для этого элемента?===&lt;br /&gt;
Щёлкнуть правой кнопкой мыши на элементе , в меню - add variable или add class&lt;br /&gt;
===Как вставить данные в буфер обмена (Clipboard) ? Как их оттуда вытащить ?===&lt;br /&gt;
&lt;br /&gt;
1) копирование в буфер обмена:&lt;br /&gt;
&lt;br /&gt;
  1.Готовим данные&lt;br /&gt;
    а.Выделяем память из кучи,  вызывая GlobalAlloc()&lt;br /&gt;
    б.Получаем указатель на выделенную память, вызывая GlobalLock()&lt;br /&gt;
    в.Заполняем данные&lt;br /&gt;
    г.Освобождаем указатель , вызывая GlobalUnlock();&lt;br /&gt;
&lt;br /&gt;
  2.Открываем буфер обмена , вызывая OpenClipboard();&lt;br /&gt;
  3.Очищаем буфер, вызывая EmptyClipboard();&lt;br /&gt;
  4.Вызываем SetClipboardData() один раз для каждого формата&lt;br /&gt;
      вставляемых данных (имеется в виду - если одни и те же&lt;br /&gt;
      данные представлены в разных форматах, и приложение&lt;br /&gt;
      может эти форматы создать)&lt;br /&gt;
  5.Закрываем буфер, вызывая CloseClipboard();&lt;br /&gt;
  6.ВЫЗЫВАТЬ GlobalFree() НЕ НУЖНО , в этом случае это&lt;br /&gt;
      предоставлено системе&lt;br /&gt;
&lt;br /&gt;
Скажем, хотим поместить в буфер обмена туда текст.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	//готовим данные&lt;br /&gt;
	//выделяем из кучи память для данных&lt;br /&gt;
	HANDLE hglbCopy = GlobalAlloc(GMEM_MOVEABLE,10);&lt;br /&gt;
	if(!hglbCopy)return;&lt;br /&gt;
&lt;br /&gt;
	//получаем указатель&lt;br /&gt;
	void* lpStr = GlobalLock(hglbCopy);&lt;br /&gt;
	if(!lpStr)return;&lt;br /&gt;
&lt;br /&gt;
	//заполняем данные&lt;br /&gt;
	strcpy((char*)lpStr,&amp;quot;my text&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	//освобождаем указатель&lt;br /&gt;
	GlobalUnlock(hglbCopy);&lt;br /&gt;
	lpStr=0;&lt;br /&gt;
&lt;br /&gt;
	//открываем буфер обмена&lt;br /&gt;
	OpenClipboard();&lt;br /&gt;
	//очищаем&lt;br /&gt;
	EmptyClipboard();&lt;br /&gt;
&lt;br /&gt;
	//текстовый формат&lt;br /&gt;
	SetClipboardData(CF_TEXT,hglbCopy);&lt;br /&gt;
&lt;br /&gt;
	//закрываем буфер&lt;br /&gt;
	CloseClipboard();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
2) извлечение из буфера обмена&lt;br /&gt;
&lt;br /&gt;
  1.Проверяем, что поддерживается нужный формат данных,&lt;br /&gt;
      вызывая IsClipboardFormatAvailable()&lt;br /&gt;
  2.Открываем буфер обмена , вызывая OpenClipboard();&lt;br /&gt;
  3.Достаём данные&lt;br /&gt;
   а.Получаем из буфера хендл требуемого формата,&lt;br /&gt;
      вызывая GetClipboardData()&lt;br /&gt;
    б.Получаем указатель на выделенную память, вызывая GlobalLock()&lt;br /&gt;
    в.Работаем с данными&lt;br /&gt;
    г.Освобождаем указатель , вызывая GlobalUnlock();&lt;br /&gt;
  4.Закрываем буфер, вызывая CloseClipboard();&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	//Проверяем, что поддерживается нужный формат данных,&lt;br /&gt;
	if(!IsClipboardFormatAvailable(CF_TEXT))return;&lt;br /&gt;
&lt;br /&gt;
	//открываем буфер обмена&lt;br /&gt;
	OpenClipboard();&lt;br /&gt;
&lt;br /&gt;
	//достаём данные&lt;br /&gt;
&lt;br /&gt;
	//текстовый формат&lt;br /&gt;
	HANDLE hglbCopy = GetClipboardData(CF_TEXT);&lt;br /&gt;
	if(!hglbCopy)return;&lt;br /&gt;
&lt;br /&gt;
	//получаем указатель&lt;br /&gt;
	void* lpStr = GlobalLock(hglbCopy);&lt;br /&gt;
	if(!lpStr)return;&lt;br /&gt;
&lt;br /&gt;
	//читаем данные&lt;br /&gt;
	char data[10];&lt;br /&gt;
	memmove(data,lpStr,sizeof(data));&lt;br /&gt;
&lt;br /&gt;
	//освобождаем указатель&lt;br /&gt;
	GlobalUnlock(hglbCopy);&lt;br /&gt;
	lpStr=0;&lt;br /&gt;
&lt;br /&gt;
	//закрываем буфер&lt;br /&gt;
	CloseClipboard();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как получить полный путь к экзешнику из самой программы ?===&lt;br /&gt;
В командную строку первым параметром система всегда передаёт заключённый в кавычки полный путь к файлу запущенной программы Достаём путь таким образом :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
BOOL CMyApp::InitInstance()&lt;br /&gt;
{&lt;br /&gt;
	//добыча полного имени экзешника&lt;br /&gt;
	CString csFullExeName;&lt;br /&gt;
	{&lt;br /&gt;
		CString csAppName=GetCommandLine();&lt;br /&gt;
		csAppName.Delete(0,1);&lt;br /&gt;
		csAppName.Replace('\&amp;quot;','\0');&lt;br /&gt;
		csFullExeName=(const char*)csAppName;&lt;br /&gt;
	}&lt;br /&gt;
	//теперь csFullExeName - содержит искомый путь&lt;br /&gt;
&lt;br /&gt;
	//...&lt;br /&gt;
	//...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Каким способом можно exe файл может заменить самого себя? То есть, моя программа обновляется, например, через Internet, и хочет обновить свой exe-файл. Но так как он в данный момент запущен - это будет, естественно, запрещено. Как это можно проще всего сделать?===&lt;br /&gt;
Один из способов - сделать копию экзешника и из него обновиться&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define def_exeNAMEup	&amp;quot;c:\\myprog_update.exe&amp;quot;&lt;br /&gt;
#define def_exeNAMEdnld	&amp;quot;c:\\myprog_downloaded.exe&amp;quot;&lt;br /&gt;
#define def_keyUdate	&amp;quot;/update&amp;quot;&lt;br /&gt;
&lt;br /&gt;
void CTESTFAQApp::UpdateItself()&lt;br /&gt;
{&lt;br /&gt;
	//добыча полного имени экзешника&lt;br /&gt;
	CString csFullExeName;&lt;br /&gt;
	{&lt;br /&gt;
		CString csAppName=GetCommandLine();&lt;br /&gt;
		csAppName.Delete(0,1);&lt;br /&gt;
		csAppName.Replace('\&amp;quot;','\0');&lt;br /&gt;
		csFullExeName=(const char*)csAppName;&lt;br /&gt;
	}&lt;br /&gt;
	//теперь csFullExeName - содержит искомый путь&lt;br /&gt;
&lt;br /&gt;
	//делаем копию экзешника с другим именем&lt;br /&gt;
	CopyFile(csFullExeName,def_exeNAMEup,0);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	//передаём в параметры нового процесса ключ и путь к текущему файлу&lt;br /&gt;
	CString csParams=def_keyUdate;&lt;br /&gt;
	csParams+=&amp;quot; &amp;quot;;&lt;br /&gt;
	csParams+=csFullExeName;&lt;br /&gt;
&lt;br /&gt;
	//запускаем копию&lt;br /&gt;
	STARTUPINFO si;&lt;br /&gt;
	PROCESS_INFORMATION pi;&lt;br /&gt;
	ZeroMemory(&amp;amp;si,sizeof(si));&lt;br /&gt;
	si.cb = sizeof(si);&lt;br /&gt;
	ZeroMemory(&amp;amp;pi,sizeof(pi));&lt;br /&gt;
	if(CreateProcess(def_exeNAMEup,def_keyUdate,0,0,0,0,0,0,&amp;amp;si,&amp;amp;pi))&lt;br /&gt;
	{&lt;br /&gt;
		//завершаем текущий процесс&lt;br /&gt;
		ExitFromMyApp();&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void CTESTFAQApp::ExitFromMyApp()&lt;br /&gt;
{&lt;br /&gt;
	exit(0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
BOOL CTESTFAQApp::InitInstance()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
	//смотрим, не запустили ли для апдейта?&lt;br /&gt;
&lt;br /&gt;
	CString txt;&lt;br /&gt;
	txt=m_lpCmdLine;&lt;br /&gt;
	if(txt.Find(def_keyUdate)==0)&lt;br /&gt;
	{&lt;br /&gt;
		//делаем айдейт&lt;br /&gt;
		txt.Replace(def_keyUdate,&amp;quot;&amp;quot;);&lt;br /&gt;
		txt.TrimLeft();&lt;br /&gt;
&lt;br /&gt;
		CString csFullExeName=txt;&lt;br /&gt;
&lt;br /&gt;
		//берём откуда то уже скачанный файл обновления&lt;br /&gt;
		//...&lt;br /&gt;
		CString csFull_Downloaded_ExeName=def_exeNAMEdnld;&lt;br /&gt;
&lt;br /&gt;
		//копируем файл (обновляем старый то есть)&lt;br /&gt;
		CopyFile(csFull_Downloaded_ExeName,csFullExeName,0);&lt;br /&gt;
&lt;br /&gt;
		//запускаем обновлённого мученника&lt;br /&gt;
		STARTUPINFO si;&lt;br /&gt;
		PROCESS_INFORMATION pi;&lt;br /&gt;
		ZeroMemory(&amp;amp;si,sizeof(si));&lt;br /&gt;
		si.cb = sizeof(si);&lt;br /&gt;
		ZeroMemory(&amp;amp;pi,sizeof(pi));&lt;br /&gt;
		if(CreateProcess(csFullExeName,0,0,0,0,0,0,0,&amp;amp;si,&amp;amp;pi))&lt;br /&gt;
&lt;br /&gt;
		ExitFromMyApp();&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
	//...&lt;br /&gt;
	//...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Есть строка символов (страничка из Инета) в кодировке utf-8 (строка char*). Как мне ее получить в формате String&lt;br /&gt;
или в char* в кодировке ANSI (cp 1251) ?===&lt;br /&gt;
Можно перевести строку из UTF8 в Unicode, затем из Unicode в 1251&lt;br /&gt;
&lt;br /&gt;
Ниже приведена структура, содержащая процедуры перекодирования,&lt;br /&gt;
а также процедуру с примером использования&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//описание структуры&lt;br /&gt;
struct coder&lt;br /&gt;
{&lt;br /&gt;
	//utf8-&amp;gt;unicode&lt;br /&gt;
	static wchar_t* utf8_to_unicode__dontForgetDeleteArr(const char *utf8_string)&lt;br /&gt;
	{&lt;br /&gt;
		wchar_t* pRes=0;&lt;br /&gt;
		int res_len=0;&lt;br /&gt;
&lt;br /&gt;
		//тест на возможность преобразования&lt;br /&gt;
		res_len=MultiByteToWideChar(CP_UTF8,0,utf8_string,-1,0,0);&lt;br /&gt;
		if(!res_len)return 0;&lt;br /&gt;
&lt;br /&gt;
		//выделяем память&lt;br /&gt;
		pRes = new wchar_t[res_len];&lt;br /&gt;
		if(!pRes)return 0;&lt;br /&gt;
&lt;br /&gt;
		//преобразование&lt;br /&gt;
		if(!MultiByteToWideChar(CP_UTF8,0,utf8_string,-1,pRes,res_len))&lt;br /&gt;
		{&lt;br /&gt;
			delete [] pRes;&lt;br /&gt;
			return 0;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		return pRes;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	//unicode-&amp;gt;1251&lt;br /&gt;
	static char * unicode_to_1251__dontForgetDeleteArr(const wchar_t *unicode_string)&lt;br /&gt;
	{&lt;br /&gt;
		char* pRes=0;&lt;br /&gt;
		int res_len=0;&lt;br /&gt;
&lt;br /&gt;
		//тест на возможность преобразования&lt;br /&gt;
		res_len = WideCharToMultiByte(1251,0,unicode_string,-1,0,0,0,0);&lt;br /&gt;
		if(!res_len)return 0;&lt;br /&gt;
&lt;br /&gt;
		//выделяем память&lt;br /&gt;
		pRes=new char[res_len];&lt;br /&gt;
		if(!pRes)return 0;&lt;br /&gt;
&lt;br /&gt;
		//преобразование&lt;br /&gt;
		if(!WideCharToMultiByte(1251,0,unicode_string,-1,pRes,res_len,0,0))&lt;br /&gt;
		{&lt;br /&gt;
			delete [] pRes;&lt;br /&gt;
			return 0;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		return pRes;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	//процедура с примером&lt;br /&gt;
	static void Example()&lt;br /&gt;
	{&lt;br /&gt;
		wchar_t* unicode_string=0;&lt;br /&gt;
		char* cp1251_string=0;&lt;br /&gt;
&lt;br /&gt;
		//исходный текст&lt;br /&gt;
		char utf8_string[] = &amp;quot;UTF-8 + СЂСѓСЃСЃРєРёР№ С‚РµРєСЃС‚&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
		for(;;)&lt;br /&gt;
		{&lt;br /&gt;
&lt;br /&gt;
			unicode_string=utf8_to_unicode__dontForgetDeleteArr(utf8_string);&lt;br /&gt;
			if(!unicode_string)&lt;br /&gt;
			{&lt;br /&gt;
				AfxMessageBox(&amp;quot;Не удалось конвертировать в unicode!&amp;quot;);&lt;br /&gt;
				break;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			cp1251_string = unicode_to_1251__dontForgetDeleteArr(unicode_string);&lt;br /&gt;
&lt;br /&gt;
			if(!cp1251_string)&lt;br /&gt;
			{&lt;br /&gt;
				AfxMessageBox(&amp;quot;Не удалось конвертировать из unicode!&amp;quot;);&lt;br /&gt;
				break;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			break;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		//cp1251_string - результат&lt;br /&gt;
		AfxMessageBox(cp1251_string);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
		//не забываем удалить массивы&lt;br /&gt;
		if(unicode_string)&lt;br /&gt;
		{&lt;br /&gt;
			delete [] unicode_string;&lt;br /&gt;
			unicode_string=0;&lt;br /&gt;
		}&lt;br /&gt;
		if(cp1251_string)&lt;br /&gt;
		{&lt;br /&gt;
			delete [] cp1251_string;&lt;br /&gt;
			cp1251_string=0;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
//вызов примера&lt;br /&gt;
coder::Example();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как организовать взаимодействие программы на VC.net с Access-овской базой данных?===&lt;br /&gt;
Проще всего подключить ADO компоненты и сделать все на них.&lt;br /&gt;
Компоненты  ADO (ADODC,DATAGRID и т.п.) это ActiveX.&lt;br /&gt;
В редакторе ресурсов, во всплывающем меню, есть Insert ActiveX Control -&amp;gt; открывается список всех компоент,&lt;br /&gt;
зарегистрированых на машине. Нужно найти компоненты (Это компоненты от MS и они помечены (OLEDB)) и вставить их в диалог. Для того что бы иметь возможность управлять ими, нужно импортировать обертки для них, это делается при помощи ClassWisard, там есть импорт-&amp;gt;класс-&amp;gt;указать файл с компоентой (OSX).&lt;br /&gt;
Появляется список всех классов, объявленых внутри.&lt;br /&gt;
Проставляем галочки, нажимаем ОК.&lt;br /&gt;
&lt;br /&gt;
[[Category:FAQ]]&lt;/div&gt;</summary>
		<author><name>Mczim</name></author>	</entry>

	<entry>
		<id>https://wiki.shelek.ru/index.php?title=FAQ:WinAPI,_VCPP_Part_3&amp;diff=416</id>
		<title>FAQ:WinAPI, VCPP Part 3</title>
		<link rel="alternate" type="text/html" href="https://wiki.shelek.ru/index.php?title=FAQ:WinAPI,_VCPP_Part_3&amp;diff=416"/>
				<updated>2008-08-14T18:52:56Z</updated>
		
		<summary type="html">&lt;p&gt;Mczim: пробел перед запятой&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Имеется приложение на основе CRichEditView. Как узнать, что пользователь меняет текст?===&lt;br /&gt;
Добавить обработчик сообщения EN_CHANGE. Сообщение генерируется CRichEditView каждый раз, когда пользователь изменяет текст в окне CRichEditView&lt;br /&gt;
===Чем метод CArray::GetSize отличается от метода CArray::GetCount?===&lt;br /&gt;
Абсолютно ничем. (Скорее всего, были предыдущие библиотеки, в которых функции, одинаковые по смыслу, имели разные имена. Поэтому в целях совместимости оставили оба)&lt;br /&gt;
===Как загрузить строку из ресурса?===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CString m_Temp;&lt;br /&gt;
m_Temp.LoadString(ID_MYSTRING);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как поменять иконку у элемента (item) в CListCtrl?===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//заполняем структуру LVITEM&lt;br /&gt;
LVITEM lvItem;&lt;br /&gt;
memset(&amp;amp;lvItem,0,sizeof(lvItem));&lt;br /&gt;
	&lt;br /&gt;
lvItem.mask = LVIF_IMAGE;//меняться будет картинка&lt;br /&gt;
lvItem.iItem = ...;// индекс элемента списка (Zero-based)&lt;br /&gt;
lvItem.iSubItem = 0;&lt;br /&gt;
lvItem.iImage = ...; //индекс иконки (из списка контрола)&lt;br /&gt;
	&lt;br /&gt;
pList-&amp;gt;SetItem(&amp;amp; lvItem);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Имеется класс Class1, содержащий мембер типа указатель на Class2. В Class2 также имеется указатель на Class1. Компилятор выдаёт ошибку. Что надо делать?===&lt;br /&gt;
Предварительно объявляем класс Class2. Тогда компилятору будет известно, что описание класса Class2 будет встречено дальше, и станет возможным объявление указателей на класс до описания самого класса.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Class2;//предопределение&lt;br /&gt;
	&lt;br /&gt;
Class1&lt;br /&gt;
{&lt;br /&gt;
	Class2* p;&lt;br /&gt;
};&lt;br /&gt;
	&lt;br /&gt;
Class2&lt;br /&gt;
{&lt;br /&gt;
	Class1* p;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как переключить раскладку в другом (то есть в активном) процессе?===&lt;br /&gt;
Использовать функции:&lt;br /&gt;
   GetKeyboardLayout - определить текущую раскладку&lt;br /&gt;
   LoadKeyboardLayout - загрузить новую раскладку&lt;br /&gt;
&lt;br /&gt;
см.также&lt;br /&gt;
   VerLanguageName - получить строку с описанием языка&lt;br /&gt;
&lt;br /&gt;
(подробности - в MSDN)&lt;br /&gt;
===Как получить хендл контрола Edit зная его ID?===&lt;br /&gt;
Пусть контрол лежит на окне CMyWnd&lt;br /&gt;
Тогда:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void CMyWnd::некая_процедура()&lt;br /&gt;
{&lt;br /&gt;
	//для MFC&lt;br /&gt;
	CEdit* ed=(CEdit* ) GetDlgItem(ID_EDIT1);&lt;br /&gt;
	HWND hwnd=ed-&amp;gt;GetSafeHwnd();&lt;br /&gt;
	...&lt;br /&gt;
	&lt;br /&gt;
	//для Win32 API&lt;br /&gt;
	HWND hwnd=GetDlgItem(m_hWnd,ID_EDIT1);&lt;br /&gt;
	...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Как из дочернего окна закрыть приложение?===&lt;br /&gt;
Нужно послать родительскому окну (*pParent) сообщение WM_CLOSE:&lt;br /&gt;
 pParent-&amp;gt;PostMessage(WM_CLOSE);//MFC&lt;br /&gt;
или&lt;br /&gt;
 ::PostMessage(pParent-&amp;gt;m_hWnd,WM_CLOSE,(WPARAM)0,(LPARAM)0);//API&lt;br /&gt;
===Как корректно перевести BSTR в CString и наоборот?===&lt;br /&gt;
Нужно просто присвоить переменной типа CString переменную типа BSTR.&lt;br /&gt;
Оператор = класса CString сам всё переведёт.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//указатель на будущий буфер с BSTR.&lt;br /&gt;
//	(По сути, BSTR определён как &lt;br /&gt;
//	typedef WCHAR* BSTR;&lt;br /&gt;
//	то есть указатель на 16-битный символ юникод)&lt;br /&gt;
	&lt;br /&gt;
BSTR bstrHE=0;&lt;br /&gt;
	&lt;br /&gt;
CString Str=&amp;quot;мой текст&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
//Выделить память и загрузить адрес блока в bstrHE&lt;br /&gt;
bstrHE=Str.AllocSysString();&lt;br /&gt;
	&lt;br /&gt;
//...	&lt;br /&gt;
//тут работаем с bstrHE[]&lt;br /&gt;
//...&lt;br /&gt;
	&lt;br /&gt;
//освобождаем память&lt;br /&gt;
SysFreeString(bstrHE);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Как получить доступ к графическим ресурсам элементов текущей темы оформления Windows?===&lt;br /&gt;
Использовать функции&lt;br /&gt;
&lt;br /&gt;
OpenThemeData()&lt;br /&gt;
DrawThemeBackground()&lt;br /&gt;
DrawFrameControl()&lt;br /&gt;
CloseThemeData().&lt;br /&gt;
&lt;br /&gt;
(подробности - в MSDN)&lt;br /&gt;
===Имеется класс , производный от CDialog. Когда диалог в фокусе, нажатие на Enter или Esc приводит к закрытию диалога. Как это запретить?===&lt;br /&gt;
При нажатии Enter происходит выполнение команды IDOK,&lt;br /&gt;
при нажатии Esc - IDCANCEL.&lt;br /&gt;
Нужно переопределить в классе виртуальные функции OnOk() и OnCancel(),&lt;br /&gt;
которые соответственно вызываются для этих команд. При помощи&lt;br /&gt;
визарда эти функции добавить можно так: Положить на диалог две кнопки&lt;br /&gt;
с идентификаторами IDOK и IDCANCEL (при создании нового диалога они там&lt;br /&gt;
есть сразу), затем двойной клик по кнопке добавляет соответствующий&lt;br /&gt;
обработчик. В обработчиках надо удалить вызовы СDialog::OnOK() и&lt;br /&gt;
CDialog::OnCancel(), тогда диалог закрываться не будет.&lt;br /&gt;
Однако тогда диалог станет невозможно закрыть кнопкой с крестиком  :)&lt;br /&gt;
&lt;br /&gt;
Лечить так: добавить обработчик сообщения WM_CLOSE - OnClose(), и в нём&lt;br /&gt;
сделать вызов OnOk() или OnCancel() :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void CPlayersPropsDialog::OnClose() &lt;br /&gt;
{&lt;br /&gt;
	CDialog::OnClose();&lt;br /&gt;
	CDialog::OnCancel();//добавлено&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===VC++6. Я написал простейший макрос, а компилятор на него ругается. Ума не приложу, что за глюк?===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	#define my_macr(x,y,z) \&lt;br /&gt;
		z=\&lt;br /&gt;
		(x+y)*\&lt;br /&gt;
		(x-y)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Скорее всего после одного из символов соединения строк &amp;quot;\&amp;quot; имеется&lt;br /&gt;
пробел или табуляция. Их надо удалить. Можно найти их &amp;quot;наощупь&amp;quot;, а&lt;br /&gt;
можно включить показ непечатных символов в студии. Найти эту команду&lt;br /&gt;
можно так:&lt;br /&gt;
Tools-&amp;gt;Customize...-&amp;gt;вкладка Commands. В окошке Category выбрать&lt;br /&gt;
&amp;quot;Edit&amp;quot;, и среди кнопок справа найти кнопку, на которой написано &amp;quot;a.b&amp;quot;&lt;br /&gt;
Эту кнопку надо перетащить на одну из панелей инструментов студии.&lt;br /&gt;
&lt;br /&gt;
===Как получить список всех процесов, включая idle?===&lt;br /&gt;
Использовать функции&lt;br /&gt;
Process32First()&lt;br /&gt;
Precess32Next()&lt;br /&gt;
&lt;br /&gt;
===Как программно установить переменные окружения?===&lt;br /&gt;
Чтобы добавить или изменить их программно, необходимо воспользоваться&lt;br /&gt;
ключом реестра HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\&lt;br /&gt;
Session Manager\Environment, а затем отправить широковещательное&lt;br /&gt;
сообщение WM_SETTINGCHANGE. Это позволит приложениям узнать об&lt;br /&gt;
изменениях:&lt;br /&gt;
&lt;br /&gt;
::SendMessage(HWND_BROADCAST,WM_SETTINGCHANGE,0,0);&lt;br /&gt;
===Как сделать, чтобы у окна был черный фон?===&lt;br /&gt;
переопределить обработчик сообщения WM_CTLCOLOR - OnCtlColor() :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CBrush br(RGB(0,0,0));&lt;br /&gt;
	&lt;br /&gt;
HBRUSH CMyDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) &lt;br /&gt;
{&lt;br /&gt;
	HBRUSH hbr = CMyDlg::OnCtlColor(pDC, pWnd, nCtlColor);&lt;br /&gt;
	&lt;br /&gt;
	//фон диалога (или вьюшки)&lt;br /&gt;
	if(nCtlColor==CTLCOLOR_DLG)&lt;br /&gt;
	{&lt;br /&gt;
		return (HBRUSH)br;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	//фон статиков (если нужно)&lt;br /&gt;
	if(nCtlColor==CTLCOLOR_STATIC)&lt;br /&gt;
	{&lt;br /&gt;
		//делаем фон текста статика прозрачным&lt;br /&gt;
		pDC-&amp;gt;SetBkMode(TRANSPARENT);&lt;br /&gt;
		return (HBRUSH)br;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	return hbr;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Почему на моем компьютере экзешник, созданный в MFC запускается, а на других компьютерах - нет? Требует какую-то  dll-ку.===&lt;br /&gt;
Нужно выбирать режим Release :&lt;br /&gt;
&lt;br /&gt;
Menu-&amp;gt;Build-&amp;gt;Configurations...-&amp;gt;Release,&lt;br /&gt;
&lt;br /&gt;
и экзешник, соответственно, брать из папки Release проекта&lt;br /&gt;
===Как в диалог добавить меню?===&lt;br /&gt;
Надо сделать в ресурсах меню, затем вставить в диалог:&lt;br /&gt;
&lt;br /&gt;
открыть в редакторе диалог, в свойствах (во вкладке General, окошко Menu) указать идентивикатор ресурса меню.&lt;br /&gt;
При помощи визарда добавить для меню обработчики OnCommand() и OnUpdateСommand().&lt;br /&gt;
===Я добавил визардом меню в диалог. Добавил обработчики для пунктов меню. Пункты работают, но OnUpdate для пунктов не вызывается - то есть не получается ни затенить, ни чек поставить. Что делать?===&lt;br /&gt;
В диалоге у меню апдейта не происходит сам, в отличие от мейнфрейма.&lt;br /&gt;
Для этого нужно сделать самим апдейт в обработчике сообщения WM_KICKIDLE.&lt;br /&gt;
Визардом обработчик не добавляется, поэтому можно переопределить виртуальную DefWindowProc() и там обработать:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;afxpriv.h&amp;gt;	//этот файл надо включить, там определёна WM_KICKIDLE&lt;br /&gt;
&lt;br /&gt;
LRESULT CMyDialog::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam) &lt;br /&gt;
{&lt;br /&gt;
	if(message==WM_KICKIDLE)&lt;br /&gt;
	{&lt;br /&gt;
		//делаем апдейт для всех пунктов меню&lt;br /&gt;
		CMenu* pMainMenu=GetMenu();&lt;br /&gt;
		if(pMainMenu)&lt;br /&gt;
		{&lt;br /&gt;
			CCmdUI cmdUI;&lt;br /&gt;
			for (UINT n=0; n &amp;lt; pMainMenu-&amp;gt;GetMenuItemCount(); ++n)&lt;br /&gt;
			{&lt;br /&gt;
				CMenu* pSubMenu = pMainMenu-&amp;gt;GetSubMenu(n);&lt;br /&gt;
				if(!pSubMenu)continue;&lt;br /&gt;
	&lt;br /&gt;
				cmdUI.m_nIndexMax = pSubMenu-&amp;gt;GetMenuItemCount();&lt;br /&gt;
				for (UINT i = 0; i &amp;lt; cmdUI.m_nIndexMax;++i)&lt;br /&gt;
				{&lt;br /&gt;
					cmdUI.m_nIndex = i;&lt;br /&gt;
					cmdUI.m_nID = pSubMenu-&amp;gt;GetMenuItemID(i);&lt;br /&gt;
					cmdUI.m_pMenu = pSubMenu;&lt;br /&gt;
					cmdUI.DoUpdate(this, FALSE);&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	return CDialog::DefWindowProc(message, wParam, lParam);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Как на Visual C++ 6.0 в Главном окне отключить системное меню (в левом верхнем углу) и кнопки(в правом верхнем углу)?===&lt;br /&gt;
При создании окна нужно убрать стиль WS_SYSMENU&lt;br /&gt;
(теперь пользователь корректно может закрыть окно только Alt+F4,&lt;br /&gt;
ну или если вы предоставите ему дополнительную возможность сделать это)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пример 1. (для SDI, MDI)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//этот обработчик уже добавлен визардом&lt;br /&gt;
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT&amp;amp; cs)&lt;br /&gt;
{&lt;br /&gt;
	if( !CFrameWnd::PreCreateWindow(cs) )&lt;br /&gt;
		return FALSE;&lt;br /&gt;
	// TODO: Modify the Window class or styles here by modifying&lt;br /&gt;
	//  the CREATESTRUCT cs&lt;br /&gt;
&lt;br /&gt;
	///////////////////////////////&lt;br /&gt;
	//добавленная часть&lt;br /&gt;
	{&lt;br /&gt;
		//убираем стиль&lt;br /&gt;
		cs.style&amp;amp;=~WS_SYSMENU;&lt;br /&gt;
	}&lt;br /&gt;
	///////////////////////////////&lt;br /&gt;
&lt;br /&gt;
	return TRUE;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Пример 2. (для диалога)&lt;br /&gt;
Если диалог описан в ресурсах, то в свойствах диалога убрать галочки&lt;br /&gt;
  &amp;quot;System menu&amp;quot;&lt;br /&gt;
  &amp;quot;Minimize box&amp;quot;&lt;br /&gt;
  &amp;quot;Maximize box&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===Хочу сделать так, чтобы пользователь не мог нажать на кнопку, пока программа не разрешит.===&lt;br /&gt;
Нужно применить метод класса CWnd::EnableWindow(...) для кнопки.&lt;br /&gt;
Значение параметра 0 делает кнопку неактивной, 1 - делает активной.&lt;br /&gt;
(кстате, не только для кнопки можно, а для любого класса, производного&lt;br /&gt;
от класса CWnd)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пусть имеется некий диалог, на нём лежит кнопка c ID == IDC_1.&lt;br /&gt;
в любом месте кода диалога (кроме конструктора и деструктора , хотя, если&lt;br /&gt;
проверить наличие валидного хендла диалога, как в примере, то ничего&lt;br /&gt;
страшного не будет и там)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//делаем кнопку неактивной&lt;br /&gt;
if(m_hWnd)&lt;br /&gt;
{&lt;br /&gt;
	CWnd* pw=0;&lt;br /&gt;
	pw=GetDlgItem(IDC_1);&lt;br /&gt;
	if(pw)pw-&amp;gt;EnableWindow(0);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Что означают сообщения, которые студия выводит при компиляции, вроде таких : Loaded 'C:\WINDOWS\SYSTEM\WSOCK32.DLL', no matching symbolic information found. ===&lt;br /&gt;
Это строка говорит о том, что студия не смогла найти отладочные&lt;br /&gt;
символы для WSOCK32.DLL. В этом нет ничего страшного, просто при наличии&lt;br /&gt;
отладочных символов в процессе отладки можно получить доступ к именам&lt;br /&gt;
функции из системных DLL. Например, вместо&lt;br /&gt;
 KERNEL32! 0x77E8B184() -&lt;br /&gt;
 увидим&lt;br /&gt;
 KERNEL32!CreateThread.&lt;br /&gt;
===Как обработать сообщения, которое приходит к некому контролу (скажем CEdit)?===&lt;br /&gt;
Нужно произвести от CEdit свой класс, и в виртуальной процедуре класса WindowProc перехватить нужные сообщения.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
virtual LRESULT WindowProc(&lt;br /&gt;
   UINT message,&lt;br /&gt;
   WPARAM wParam,&lt;br /&gt;
   LPARAM lParam &lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Пример. Полностью выключаем, скажем, обработку сообщения WM_CHAR&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	LRESULT CMyEdit::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) &lt;br /&gt;
	{&lt;br /&gt;
		switch(message)&lt;br /&gt;
		{&lt;br /&gt;
			case WM_CHAR:&lt;br /&gt;
			{&lt;br /&gt;
				return 0;&lt;br /&gt;
			}&lt;br /&gt;
			break;&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		return CEdit::WindowProc(message, wParam, lParam);&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Чтобы связать экземпляр класса с контролом на форме, добавьте визардом для&lt;br /&gt;
контрола переменную класса (выбрав не Value а Control).&lt;br /&gt;
&lt;br /&gt;
===Как настроить количество пробелов в табуляции?===&lt;br /&gt;
Tools-&amp;gt;Options-&amp;gt;Tabs-&amp;gt;Insert Spaces&lt;br /&gt;
(или  правой кнопкой мыши по тексту-&amp;gt; properties)&lt;br /&gt;
===Как автоматически расставить отступы?===&lt;br /&gt;
Выделить текст для форматирования, нажать Alt+F8&lt;br /&gt;
&lt;br /&gt;
Есть ещё программа Artistic Style, которая занимается&lt;br /&gt;
переформатированием кода&lt;br /&gt;
http://sourceforge.net/projects/astyle/&lt;br /&gt;
===Поиск границ блока===&lt;br /&gt;
&amp;quot;CTRL+ }&amp;quot; ищет парную фигурную скобку в тексте и переходит на неё&lt;br /&gt;
===Вертикальное выделение текста===&lt;br /&gt;
&amp;quot;Alt + выделение мышкой&amp;quot; - позволяет выделять вертикальные фрагменты текста&lt;br /&gt;
===Как узнать количество установленных в CListCtrl столбцов?===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CListCtrl* pL=...; //указатель на переменную-контрол&lt;br /&gt;
&lt;br /&gt;
int count=pL-&amp;gt;GetHeaderCtrl()-&amp;gt;GetItemCount();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Как получить иконку приложения?===&lt;br /&gt;
Если приложение запущено, то нужно найти его главное окно и&lt;br /&gt;
послать ему сообщение WM_GETICON.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//функция возвращант хендл иконки &lt;br /&gt;
LRESULT SendMessage(hWnd, WM_GETICON, wParam, 0);&lt;br /&gt;
&lt;br /&gt;
//hWnd == хендл окна приложения&lt;br /&gt;
//wParam == &lt;br /&gt;
//	1)==ICON_BIG - получить большую иконку&lt;br /&gt;
//	2)==ICON_SMALL - получить маленькую иконку&lt;br /&gt;
//	3)==ICON_SMALL2 - получить маленькую иконку, если она определена&lt;br /&gt;
//				в приложении. Если её нет, то маленькую иконку, &lt;br /&gt;
//				сгенерированную системой из большой иконки&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как в CString можно найти или вырезать часть строки?===&lt;br /&gt;
есть такие методы в CString:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//вырезает кусок строки&lt;br /&gt;
CString Mid(int nFirst) const;&lt;br /&gt;
CString Mid(int nFirst,  int nCount) const;&lt;br /&gt;
&lt;br /&gt;
//возвращает кусок строки (сначала или с конца)&lt;br /&gt;
CString Left(int nCount ) const;&lt;br /&gt;
CString Right(int nCount ) const;&lt;br /&gt;
&lt;br /&gt;
//возвращает начальный кусок строки, в котором есть только&lt;br /&gt;
//символы из набора,представленного в lpszCharSet&lt;br /&gt;
CString SpanIncluding(LPCTSTR lpszCharSet ) const;&lt;br /&gt;
&lt;br /&gt;
//возвращает начальный кусок строки, в котором нет&lt;br /&gt;
//символов из набора,представленного в lpszCharSet&lt;br /&gt;
CString SpanExcluding(LPCTSTR lpszCharSet ) const; &lt;br /&gt;
&lt;br /&gt;
//убирает &amp;quot;пробелоподобные&amp;quot; символы из самого начала строки&lt;br /&gt;
//(то есть - пробел, табуляцию (\t) , возврат каретки, перевод строки (/r/n))&lt;br /&gt;
void TrimLeft();&lt;br /&gt;
//убирает все повторы символа из самого начала строки&lt;br /&gt;
void TrimLeft(TCHAR chTarget );&lt;br /&gt;
//убирает из самого начала строки все символа из набора lpszTargets &lt;br /&gt;
void TrimLeft(LPCTSTR lpszTargets ); &lt;br /&gt;
&lt;br /&gt;
void TrimRight();&lt;br /&gt;
void TrimRight(TCHAR chTarget );&lt;br /&gt;
void TrimRight(LPCTSTR lpszTargets ); &lt;br /&gt;
&lt;br /&gt;
//поиск в строке&lt;br /&gt;
int Find( TCHAR ch ) const;&lt;br /&gt;
int Find( LPCTSTR lpszSub ) const;&lt;br /&gt;
int Find( TCHAR ch, int nStart ) const;&lt;br /&gt;
int Find( LPCTSTR pstr, int nStart ) const;&lt;br /&gt;
&lt;br /&gt;
//поиск, начиная с конца&lt;br /&gt;
int ReverseFind( TCHAR ch ) const;&lt;br /&gt;
&lt;br /&gt;
//поиск позиции первого символа, одного из набора,&lt;br /&gt;
// представленного в lpszCharSet&lt;br /&gt;
int FindOneOf( LPCTSTR lpszCharSet ) const;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Есть у меня CListBox и я в ходе выполнения программы добавляю в него строки. Но я не могу посмотреть что именно добавляется. Вывод результатов происходит в конце выполнения процедуры...===&lt;br /&gt;
Если нужно делать принудительную перерисовку окна во время&lt;br /&gt;
длительных вычислений, то нужно вызывать для окна, которое&lt;br /&gt;
надо перерисовать метод&lt;br /&gt;
  RedrawWindow()&lt;br /&gt;
с параметрами по умолчанию, или пару&lt;br /&gt;
  Invalidate(0);&lt;br /&gt;
  UpdateWindow();&lt;br /&gt;
Это приводит к пометке всего окна к перерисовке и отправлению&lt;br /&gt;
сообщения WM_PAINT в оконную процедуру в обход очереди&lt;br /&gt;
сообщений, вызывая немедленную перерисовку окна.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CWnd* pw=...;//окно, которое надо перерисовывать&lt;br /&gt;
&lt;br /&gt;
for(int i=0;i&amp;lt;10000)&lt;br /&gt;
{&lt;br /&gt;
	//меняется содержимое окна&lt;br /&gt;
	//...&lt;br /&gt;
&lt;br /&gt;
	//немедленная перерисовка&lt;br /&gt;
	pw-&amp;gt;Invalidate(0);&lt;br /&gt;
	pw-&amp;gt;UpdateWindow();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Я написал DLL , которую используют несколько приложений. Всё вроде работает, но когда происходит очередной вызов функции из DLL , почему то данные в функции обнуляются. С чем это связано ?===&lt;br /&gt;
Переменные и массивы в DLL, содержимое которых должно использоваться несколькими процессами, должны объявляться статическими. Статическая переменная или массив инициализируются только один раз в момент загрузки DLL.&lt;br /&gt;
Пример:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DWORD calltest()&lt;br /&gt;
{&lt;br /&gt;
	//будет выполнено только при первом вызове&lt;br /&gt;
	static DWORD callcount=0;&lt;br /&gt;
	static DWORD str[1000]={0}; &lt;br /&gt;
&lt;br /&gt;
	//будет выполняться каждый раз&lt;br /&gt;
	return ++callcount;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как открыть проекцию файла в память и как с ней работать?===&lt;br /&gt;
Как открыть проекцию файла в память и как с ней работать?&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HANDLE CreateFileMapping(&lt;br /&gt;
  HANDLE hFile,	//хендл уже открытого файла&lt;br /&gt;
  LPSECURITY_ATTRIBUTES lpAttributes,&lt;br /&gt;
  DWORD flProtect,	//способ открытия проекции&lt;br /&gt;
  DWORD dwMaximumSizeHigh,	//размер файла (старшие 4 байта , обычно==0)&lt;br /&gt;
  DWORD dwMaximumSizeLow,	//размер файла (младшие 4 байта)&lt;br /&gt;
  LPCTSTR lpName&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Доступ к созданной проекции производится процедурой&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LPVOID MapViewOfFile(&lt;br /&gt;
  HANDLE hFileMappingObject, //хендл проекции&lt;br /&gt;
  DWORD dwDesiredAccess,	//способ работы с проекцией&lt;br /&gt;
  DWORD dwFileOffsetHigh,&lt;br /&gt;
  DWORD dwFileOffsetLow, //смещение от начала файла (младшие 4 байта)&lt;br /&gt;
  SIZE_T dwNumberOfBytesToMap //длина в байтах (если ==0 - то весь файл)&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
далее с файлом можно работать как с обычным массивом в памяти.&lt;br /&gt;
&lt;br /&gt;
После работы с проекцией , её надо освободить процедурой&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
BOOL UnmapViewOfFile(&lt;br /&gt;
  LPCVOID lpBaseAddress //адрес, который вернула процедура MapViewOfFile&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Пример.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HANDLE hMapFile=0;//для проекции&lt;br /&gt;
&lt;br /&gt;
HANDLE hFile=...;//хендл уже открытого файла&lt;br /&gt;
DWORD dwdFileLen=...;//размер открытого файла&lt;br /&gt;
&lt;br /&gt;
//создаём проекцию &amp;quot;только для чтения&amp;quot;&lt;br /&gt;
hMapFile=::CreateFileMapping(hFile,0,PAGE_READONLY,0,dwdFileLen,0);&lt;br /&gt;
&lt;br /&gt;
//хендл hFile можно закрыть уже здесь, в принципе,&lt;br /&gt;
//но мы сделаем это позже&lt;br /&gt;
&lt;br /&gt;
//получаем доступ к проекции (тоже только для чтения)&lt;br /&gt;
BYTE* pbyFile=(BYTE*)::MapViewOfFile(hMapFile,FILE_MAP_READ,0,0,0);&lt;br /&gt;
&lt;br /&gt;
///////////////////&lt;br /&gt;
//тут работаем с массивом pbyFile[dwdFileLen] как с обычным,&lt;br /&gt;
//только не забываем, что он открыт только для чтения&lt;br /&gt;
//...&lt;br /&gt;
//...&lt;br /&gt;
//...&lt;br /&gt;
///////////////////&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//отключаем файл данных от адресного пространства&lt;br /&gt;
UnmapViewOfFile(pbyFile);&lt;br /&gt;
&lt;br /&gt;
//освобождаем хендл проекции&lt;br /&gt;
CloseHandle(hMapFile)&lt;br /&gt;
&lt;br /&gt;
//освобождаем хендл открытого файла&lt;br /&gt;
CloseHandle(hFile);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Использую MFC Grid control 2.25 , не получается отобразить картинку в ячейке. Как это делается ?===&lt;br /&gt;
Нужно создать список изображений (CImageList) , затем передать указатель на список в контрол. Поскольку контрол лишь копирует указатель , список должен создаваться динамически, либо быть членом класса, экземпляр которого существует всё время работы контрола.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 m_GridMarket&lt;br /&gt;
CImageList m_ImageList;&lt;br /&gt;
CGridCtrL m_Grid1&lt;br /&gt;
...&lt;br /&gt;
...&lt;br /&gt;
//неким образом создаётся список&lt;br /&gt;
m_ImageList.Create(...);&lt;br /&gt;
//...&lt;br /&gt;
&lt;br /&gt;
//вставляем в контрол&lt;br /&gt;
m_Grid1.SetImageList(&amp;amp;m_ImageList);&lt;br /&gt;
&lt;br /&gt;
//&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как при помощи IPicture отобразить картинку из файла? ===&lt;br /&gt;
Пример - несложная функция, отображающая картинку из файла&lt;br /&gt;
&lt;br /&gt;
поддерживаются форматы&lt;br /&gt;
BMP, GIF, JPEG, PNG, TIFF, EMF&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;quot;atlconv.h&amp;quot;&lt;br /&gt;
#define HandleIsValid(H) (H!=(HANDLE)-1 &amp;amp;&amp;amp; H!=(HANDLE)0)&lt;br /&gt;
&lt;br /&gt;
//*pDestDC - CDC, на который предполагается вывод картинки&lt;br /&gt;
//pchzFilePath - путь к файлу&lt;br /&gt;
//pWid - (возвращает) ширина картинки&lt;br /&gt;
//pHig - (возвращает) высота картинки&lt;br /&gt;
bool DrawBitmapFromFile(CDC* pDestDC,const char* pchzFilePath,int *pWid=0,int *pHig=0)&lt;br /&gt;
{&lt;br /&gt;
	bool result=false;&lt;br /&gt;
&lt;br /&gt;
	if(pWid)*pWid=0;&lt;br /&gt;
	if(pHig)*pHig=0;&lt;br /&gt;
&lt;br /&gt;
	int Wid=0;&lt;br /&gt;
	int Hig=0;&lt;br /&gt;
&lt;br /&gt;
	IPicture* pPic=0;&lt;br /&gt;
	try&lt;br /&gt;
	{&lt;br /&gt;
		IPicture* ptmpPic=0;&lt;br /&gt;
		USES_CONVERSION;&lt;br /&gt;
		HRESULT hr;&lt;br /&gt;
&lt;br /&gt;
		CString txt=pchzFilePath;&lt;br /&gt;
		hr= ::OleLoadPicturePath(&lt;br /&gt;
			const_cast&amp;lt;LPOLESTR&amp;gt;(T2COLE(txt)),&lt;br /&gt;
			0,0,0,IID_IPicture,&lt;br /&gt;
			reinterpret_cast&amp;lt;void **&amp;gt;(&amp;amp;ptmpPic)&lt;br /&gt;
			);&lt;br /&gt;
&lt;br /&gt;
		if(hr==S_OK &amp;amp;&amp;amp; ptmpPic)&lt;br /&gt;
		{&lt;br /&gt;
			pPic=ptmpPic;&lt;br /&gt;
		}&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			throw 0;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		OLE_XPOS_HIMETRIC cxSrc;&lt;br /&gt;
		OLE_YPOS_HIMETRIC cySrc;&lt;br /&gt;
&lt;br /&gt;
		if(S_OK!=pPic-&amp;gt;get_Width(&amp;amp;cxSrc))throw 0;&lt;br /&gt;
		if(S_OK!=pPic-&amp;gt;get_Height(&amp;amp;cySrc))throw 0;&lt;br /&gt;
&lt;br /&gt;
		Wid=cxSrc/26;&lt;br /&gt;
		Hig=cySrc/26;&lt;br /&gt;
&lt;br /&gt;
		//рисуем&lt;br /&gt;
		if(S_OK !=pPic-&amp;gt;Render(pDestDC-&amp;gt;GetSafeHdc(),&lt;br /&gt;
			0,Hig,Wid,-Hig,0,0,cxSrc,cySrc,0))throw 0;&lt;br /&gt;
	}&lt;br /&gt;
	catch(...)&lt;br /&gt;
	{&lt;br /&gt;
		result=false;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if(pPic)&lt;br /&gt;
	{&lt;br /&gt;
		pPic-&amp;gt;Release();&lt;br /&gt;
		pPic=0;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	if(pWid)*pWid=Wid;&lt;br /&gt;
	if(pHig)*pHig=Hig;&lt;br /&gt;
&lt;br /&gt;
	return result;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===У меня модальное диалоговое окно, в нем поле редактирования мультилайновое, т.е. чтобы перейти на новую строку надо нажать ентер, но вызывается стандартный обработчик диалогового окна. Подскажите, что делать?===&lt;br /&gt;
Нужно в редакторе ресурсов поставить для CEdit окошка галочку&lt;br /&gt;
свойства WantReturn,&lt;br /&gt;
&lt;br /&gt;
или добавить ES_WANTRETURN при создании CEdit контрола динамически.&lt;br /&gt;
===Как выводят картинку-логотип(splash screen) при запуске программы? То есть, когда загружается программа на экран выводится картинка, потом она исчезает(загрузка программы закончена) и пользователь может приступать к работе ===&lt;br /&gt;
Для этого используется класс, производный от CDialog. Этот диалог после создания показывает себя на экран, выводя на себя рисунок. Также запускает таймет, по срабатывани которого диалог гасится. Создаётся диалог InitInstance приложения.&lt;br /&gt;
&lt;br /&gt;
В VC6++ также есть уже готовый компонент&lt;br /&gt;
Project-&amp;gt;Add To Project -&amp;gt; Components and Controls-&amp;gt;(в папке &amp;quot;Visual C++ Components&amp;quot; есть SplashScreen.)&lt;br /&gt;
===Как сделать, чтобы при выпадении списка у ComboBox была не одна строка, а больше, вроде все свойства покрутил, не помогает Вместо выпадающего списка одна строка и скролл...===&lt;br /&gt;
В редакторе ресурсов надо щелкнуть в комбобоксе на треугольнике - появляется рамка для растягивания вниз - размер выпадающего списка.&lt;br /&gt;
===В VC++.net , что делать после того, как на форму установил ActiiveX ListView, как объявить класс и переменную для этого элемента?===&lt;br /&gt;
Щёлкнуть правой кнопкой мыши на элементе , в меню - add variable или add class&lt;br /&gt;
===Как вставить данные в буфер обмена (Clipboard) ? Как их оттуда вытащить ?===&lt;br /&gt;
&lt;br /&gt;
1) копирование в буфер обмена:&lt;br /&gt;
&lt;br /&gt;
  1.Готовим данные&lt;br /&gt;
    а.Выделяем память из кучи,  вызывая GlobalAlloc()&lt;br /&gt;
    б.Получаем указатель на выделенную память, вызывая GlobalLock()&lt;br /&gt;
    в.Заполняем данные&lt;br /&gt;
    г.Освобождаем указатель , вызывая GlobalUnlock();&lt;br /&gt;
&lt;br /&gt;
  2.Открываем буфер обмена , вызывая OpenClipboard();&lt;br /&gt;
  3.Очищаем буфер, вызывая EmptyClipboard();&lt;br /&gt;
  4.Вызываем SetClipboardData() один раз для каждого формата&lt;br /&gt;
      вставляемых данных (имеется в виду - если одни и те же&lt;br /&gt;
      данные представлены в разных форматах, и приложение&lt;br /&gt;
      может эти форматы создать)&lt;br /&gt;
  5.Закрываем буфер, вызывая CloseClipboard();&lt;br /&gt;
  6.ВЫЗЫВАТЬ GlobalFree() НЕ НУЖНО , в этом случае это&lt;br /&gt;
      предоставлено системе&lt;br /&gt;
&lt;br /&gt;
Скажем, хотим поместить в буфер обмена туда текст.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	//готовим данные&lt;br /&gt;
	//выделяем из кучи память для данных&lt;br /&gt;
	HANDLE hglbCopy = GlobalAlloc(GMEM_MOVEABLE,10);&lt;br /&gt;
	if(!hglbCopy)return;&lt;br /&gt;
&lt;br /&gt;
	//получаем указатель&lt;br /&gt;
	void* lpStr = GlobalLock(hglbCopy);&lt;br /&gt;
	if(!lpStr)return;&lt;br /&gt;
&lt;br /&gt;
	//заполняем данные&lt;br /&gt;
	strcpy((char*)lpStr,&amp;quot;my text&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	//освобождаем указатель&lt;br /&gt;
	GlobalUnlock(hglbCopy);&lt;br /&gt;
	lpStr=0;&lt;br /&gt;
&lt;br /&gt;
	//открываем буфер обмена&lt;br /&gt;
	OpenClipboard();&lt;br /&gt;
	//очищаем&lt;br /&gt;
	EmptyClipboard();&lt;br /&gt;
&lt;br /&gt;
	//текстовый формат&lt;br /&gt;
	SetClipboardData(CF_TEXT,hglbCopy);&lt;br /&gt;
&lt;br /&gt;
	//закрываем буфер&lt;br /&gt;
	CloseClipboard();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
2) извлечение из буфера обмена&lt;br /&gt;
&lt;br /&gt;
  1.Проверяем, что поддерживается нужный формат данных,&lt;br /&gt;
      вызывая IsClipboardFormatAvailable()&lt;br /&gt;
  2.Открываем буфер обмена , вызывая OpenClipboard();&lt;br /&gt;
  3.Достаём данные&lt;br /&gt;
   а.Получаем из буфера хендл требуемого формата,&lt;br /&gt;
      вызывая GetClipboardData()&lt;br /&gt;
    б.Получаем указатель на выделенную память, вызывая GlobalLock()&lt;br /&gt;
    в.Работаем с данными&lt;br /&gt;
    г.Освобождаем указатель , вызывая GlobalUnlock();&lt;br /&gt;
  4.Закрываем буфер, вызывая CloseClipboard();&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	//Проверяем, что поддерживается нужный формат данных,&lt;br /&gt;
	if(!IsClipboardFormatAvailable(CF_TEXT))return;&lt;br /&gt;
&lt;br /&gt;
	//открываем буфер обмена&lt;br /&gt;
	OpenClipboard();&lt;br /&gt;
&lt;br /&gt;
	//достаём данные&lt;br /&gt;
&lt;br /&gt;
	//текстовый формат&lt;br /&gt;
	HANDLE hglbCopy = GetClipboardData(CF_TEXT);&lt;br /&gt;
	if(!hglbCopy)return;&lt;br /&gt;
&lt;br /&gt;
	//получаем указатель&lt;br /&gt;
	void* lpStr = GlobalLock(hglbCopy);&lt;br /&gt;
	if(!lpStr)return;&lt;br /&gt;
&lt;br /&gt;
	//читаем данные&lt;br /&gt;
	char data[10];&lt;br /&gt;
	memmove(data,lpStr,sizeof(data));&lt;br /&gt;
&lt;br /&gt;
	//освобождаем указатель&lt;br /&gt;
	GlobalUnlock(hglbCopy);&lt;br /&gt;
	lpStr=0;&lt;br /&gt;
&lt;br /&gt;
	//закрываем буфер&lt;br /&gt;
	CloseClipboard();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как получить полный путь к экзешнику из самой программы ?===&lt;br /&gt;
В командную строку первым параметром система всегда передаёт заключённый в кавычки полный путь к файлу запущенной программы Достаём путь таким образом :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
BOOL CMyApp::InitInstance()&lt;br /&gt;
{&lt;br /&gt;
	//добыча полного имени экзешника&lt;br /&gt;
	CString csFullExeName;&lt;br /&gt;
	{&lt;br /&gt;
		CString csAppName=GetCommandLine();&lt;br /&gt;
		csAppName.Delete(0,1);&lt;br /&gt;
		csAppName.Replace('\&amp;quot;','\0');&lt;br /&gt;
		csFullExeName=(const char*)csAppName;&lt;br /&gt;
	}&lt;br /&gt;
	//теперь csFullExeName - содержит искомый путь&lt;br /&gt;
&lt;br /&gt;
	//...&lt;br /&gt;
	//...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Каким способом можно exe файл может заменить самого себя? То есть, моя программа обновляется, например, через Internet, и хочет обновить свой exe-файл. Но так как он в данный момент запущен - это будет, естественно, запрещено. Как это можно проще всего сделать?===&lt;br /&gt;
Один из способов - сделать копию экзешника и из него обновиться&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define def_exeNAMEup	&amp;quot;c:\\myprog_update.exe&amp;quot;&lt;br /&gt;
#define def_exeNAMEdnld	&amp;quot;c:\\myprog_downloaded.exe&amp;quot;&lt;br /&gt;
#define def_keyUdate	&amp;quot;/update&amp;quot;&lt;br /&gt;
&lt;br /&gt;
void CTESTFAQApp::UpdateItself()&lt;br /&gt;
{&lt;br /&gt;
	//добыча полного имени экзешника&lt;br /&gt;
	CString csFullExeName;&lt;br /&gt;
	{&lt;br /&gt;
		CString csAppName=GetCommandLine();&lt;br /&gt;
		csAppName.Delete(0,1);&lt;br /&gt;
		csAppName.Replace('\&amp;quot;','\0');&lt;br /&gt;
		csFullExeName=(const char*)csAppName;&lt;br /&gt;
	}&lt;br /&gt;
	//теперь csFullExeName - содержит искомый путь&lt;br /&gt;
&lt;br /&gt;
	//делаем копию экзешника с другим именем&lt;br /&gt;
	CopyFile(csFullExeName,def_exeNAMEup,0);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	//передаём в параметры нового процесса ключ и путь к текущему файлу&lt;br /&gt;
	CString csParams=def_keyUdate;&lt;br /&gt;
	csParams+=&amp;quot; &amp;quot;;&lt;br /&gt;
	csParams+=csFullExeName;&lt;br /&gt;
&lt;br /&gt;
	//запускаем копию&lt;br /&gt;
	STARTUPINFO si;&lt;br /&gt;
	PROCESS_INFORMATION pi;&lt;br /&gt;
	ZeroMemory(&amp;amp;si,sizeof(si));&lt;br /&gt;
	si.cb = sizeof(si);&lt;br /&gt;
	ZeroMemory(&amp;amp;pi,sizeof(pi));&lt;br /&gt;
	if(CreateProcess(def_exeNAMEup,def_keyUdate,0,0,0,0,0,0,&amp;amp;si,&amp;amp;pi))&lt;br /&gt;
	{&lt;br /&gt;
		//завершаем текущий процесс&lt;br /&gt;
		ExitFromMyApp();&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void CTESTFAQApp::ExitFromMyApp()&lt;br /&gt;
{&lt;br /&gt;
	exit(0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
BOOL CTESTFAQApp::InitInstance()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
	//смотрим, не запустили ли для апдейта?&lt;br /&gt;
&lt;br /&gt;
	CString txt;&lt;br /&gt;
	txt=m_lpCmdLine;&lt;br /&gt;
	if(txt.Find(def_keyUdate)==0)&lt;br /&gt;
	{&lt;br /&gt;
		//делаем айдейт&lt;br /&gt;
		txt.Replace(def_keyUdate,&amp;quot;&amp;quot;);&lt;br /&gt;
		txt.TrimLeft();&lt;br /&gt;
&lt;br /&gt;
		CString csFullExeName=txt;&lt;br /&gt;
&lt;br /&gt;
		//берём откуда то уже скачанный файл обновления&lt;br /&gt;
		//...&lt;br /&gt;
		CString csFull_Downloaded_ExeName=def_exeNAMEdnld;&lt;br /&gt;
&lt;br /&gt;
		//копируем файл (обновляем старый то есть)&lt;br /&gt;
		CopyFile(csFull_Downloaded_ExeName,csFullExeName,0);&lt;br /&gt;
&lt;br /&gt;
		//запускаем обновлённого мученника&lt;br /&gt;
		STARTUPINFO si;&lt;br /&gt;
		PROCESS_INFORMATION pi;&lt;br /&gt;
		ZeroMemory(&amp;amp;si,sizeof(si));&lt;br /&gt;
		si.cb = sizeof(si);&lt;br /&gt;
		ZeroMemory(&amp;amp;pi,sizeof(pi));&lt;br /&gt;
		if(CreateProcess(csFullExeName,0,0,0,0,0,0,0,&amp;amp;si,&amp;amp;pi))&lt;br /&gt;
&lt;br /&gt;
		ExitFromMyApp();&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
	//...&lt;br /&gt;
	//...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Есть строка символов (страничка из Инета) в кодировке utf-8 (строка char*). Как мне ее получить в формате String&lt;br /&gt;
или в char* в кодировке ANSI (cp 1251) ?===&lt;br /&gt;
Можно перевести строку из UTF8 в Unicode, затем из Unicode в 1251&lt;br /&gt;
&lt;br /&gt;
Ниже приведена структура, содержащая процедуры перекодирования,&lt;br /&gt;
а также процедуру с примером использования&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//описание структуры&lt;br /&gt;
struct coder&lt;br /&gt;
{&lt;br /&gt;
	//utf8-&amp;gt;unicode&lt;br /&gt;
	static wchar_t* utf8_to_unicode__dontForgetDeleteArr(const char *utf8_string)&lt;br /&gt;
	{&lt;br /&gt;
		wchar_t* pRes=0;&lt;br /&gt;
		int res_len=0;&lt;br /&gt;
&lt;br /&gt;
		//тест на возможность преобразования&lt;br /&gt;
		res_len=MultiByteToWideChar(CP_UTF8,0,utf8_string,-1,0,0);&lt;br /&gt;
		if(!res_len)return 0;&lt;br /&gt;
&lt;br /&gt;
		//выделяем память&lt;br /&gt;
		pRes = new wchar_t[res_len];&lt;br /&gt;
		if(!pRes)return 0;&lt;br /&gt;
&lt;br /&gt;
		//преобразование&lt;br /&gt;
		if(!MultiByteToWideChar(CP_UTF8,0,utf8_string,-1,pRes,res_len))&lt;br /&gt;
		{&lt;br /&gt;
			delete [] pRes;&lt;br /&gt;
			return 0;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		return pRes;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	//unicode-&amp;gt;1251&lt;br /&gt;
	static char * unicode_to_1251__dontForgetDeleteArr(const wchar_t *unicode_string)&lt;br /&gt;
	{&lt;br /&gt;
		char* pRes=0;&lt;br /&gt;
		int res_len=0;&lt;br /&gt;
&lt;br /&gt;
		//тест на возможность преобразования&lt;br /&gt;
		res_len = WideCharToMultiByte(1251,0,unicode_string,-1,0,0,0,0);&lt;br /&gt;
		if(!res_len)return 0;&lt;br /&gt;
&lt;br /&gt;
		//выделяем память&lt;br /&gt;
		pRes=new char[res_len];&lt;br /&gt;
		if(!pRes)return 0;&lt;br /&gt;
&lt;br /&gt;
		//преобразование&lt;br /&gt;
		if(!WideCharToMultiByte(1251,0,unicode_string,-1,pRes,res_len,0,0))&lt;br /&gt;
		{&lt;br /&gt;
			delete [] pRes;&lt;br /&gt;
			return 0;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		return pRes;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	//процедура с примером&lt;br /&gt;
	static void Example()&lt;br /&gt;
	{&lt;br /&gt;
		wchar_t* unicode_string=0;&lt;br /&gt;
		char* cp1251_string=0;&lt;br /&gt;
&lt;br /&gt;
		//исходный текст&lt;br /&gt;
		char utf8_string[] = &amp;quot;UTF-8 + СЂСѓСЃСЃРєРёР№ С‚РµРєСЃС‚&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
		for(;;)&lt;br /&gt;
		{&lt;br /&gt;
&lt;br /&gt;
			unicode_string=utf8_to_unicode__dontForgetDeleteArr(utf8_string);&lt;br /&gt;
			if(!unicode_string)&lt;br /&gt;
			{&lt;br /&gt;
				AfxMessageBox(&amp;quot;Не удалось конвертировать в unicode!&amp;quot;);&lt;br /&gt;
				break;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			cp1251_string = unicode_to_1251__dontForgetDeleteArr(unicode_string);&lt;br /&gt;
&lt;br /&gt;
			if(!cp1251_string)&lt;br /&gt;
			{&lt;br /&gt;
				AfxMessageBox(&amp;quot;Не удалось конвертировать из unicode!&amp;quot;);&lt;br /&gt;
				break;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			break;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		//cp1251_string - результат&lt;br /&gt;
		AfxMessageBox(cp1251_string);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
		//не забываем удалить массивы&lt;br /&gt;
		if(unicode_string)&lt;br /&gt;
		{&lt;br /&gt;
			delete [] unicode_string;&lt;br /&gt;
			unicode_string=0;&lt;br /&gt;
		}&lt;br /&gt;
		if(cp1251_string)&lt;br /&gt;
		{&lt;br /&gt;
			delete [] cp1251_string;&lt;br /&gt;
			cp1251_string=0;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
//вызов примера&lt;br /&gt;
coder::Example();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как организовать взаимодействие программы на VC.net с Access-овской базой данных?===&lt;br /&gt;
Проще всего подключить ADO компоненты и сделать все на них.&lt;br /&gt;
Компоненты  ADO (ADODC,DATAGRID и т.п.) это ActiveX.&lt;br /&gt;
В редакторе ресурсов, во всплывающем меню, есть Insert ActiveX Control -&amp;gt; открывается список всех компоент,&lt;br /&gt;
зарегистрированых на машине. Нужно найти компоненты (Это компоненты от MS и они помечены (OLEDB)) и вставить их в диалог. Для того что бы иметь возможность управлять ими, нужно импортировать обертки для них, это делается при помощи ClassWisard, там есть импорт-&amp;gt;класс-&amp;gt;указать файл с компоентой (OSX).&lt;br /&gt;
Появляется список всех классов, объявленых внутри.&lt;br /&gt;
Проставляем галочки, нажимаем ОК.&lt;br /&gt;
&lt;br /&gt;
[[Category:FAQ]]&lt;/div&gt;</summary>
		<author><name>Mczim</name></author>	</entry>

	<entry>
		<id>https://wiki.shelek.ru/index.php?title=FAQ:WinAPI,_VCPP_Part_3&amp;diff=415</id>
		<title>FAQ:WinAPI, VCPP Part 3</title>
		<link rel="alternate" type="text/html" href="https://wiki.shelek.ru/index.php?title=FAQ:WinAPI,_VCPP_Part_3&amp;diff=415"/>
				<updated>2008-08-14T18:51:09Z</updated>
		
		<summary type="html">&lt;p&gt;Mczim: пробел перед двоеточием в CString:&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Имеется приложение на основе CRichEditView. Как узнать, что пользователь меняет текст?===&lt;br /&gt;
Добавить обработчик сообщения EN_CHANGE. Сообщение генерируется CRichEditView каждый раз, когда пользователь изменяет текст в окне CRichEditView&lt;br /&gt;
===Чем метод CArray::GetSize отличается от метода CArray::GetCount?===&lt;br /&gt;
Абсолютно ничем. (Скорее всего, были предыдущие библиотеки, в которых функции, одинаковые по смыслу, имели разные имена. Поэтому в целях совместимости оставили оба)&lt;br /&gt;
===Как загрузить строку из ресурса?===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CString m_Temp;&lt;br /&gt;
m_Temp.LoadString(ID_MYSTRING);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как поменять иконку у элемента (item) в CListCtrl?===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//заполняем структуру LVITEM&lt;br /&gt;
LVITEM lvItem;&lt;br /&gt;
memset(&amp;amp;lvItem,0,sizeof(lvItem));&lt;br /&gt;
	&lt;br /&gt;
lvItem.mask = LVIF_IMAGE;//меняться будет картинка&lt;br /&gt;
lvItem.iItem = ...;// индекс элемента списка (Zero-based)&lt;br /&gt;
lvItem.iSubItem = 0;&lt;br /&gt;
lvItem.iImage = ...; //индекс иконки (из списка контрола)&lt;br /&gt;
	&lt;br /&gt;
pList-&amp;gt;SetItem(&amp;amp; lvItem);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Имеется класс Class1, содержащий мембер типа указатель на Class2. В Class2 также имеется указатель на Class1. Компилятор выдаёт ошибку. Что надо делать?===&lt;br /&gt;
Предварительно объявляем класс Class2. Тогда компилятору будет известно, что описание класса Class2 будет встречено дальше, и станет возможным объявление указателей на класс до описания самого класса.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Class2;//предопределение&lt;br /&gt;
	&lt;br /&gt;
Class1&lt;br /&gt;
{&lt;br /&gt;
	Class2* p;&lt;br /&gt;
};&lt;br /&gt;
	&lt;br /&gt;
Class2&lt;br /&gt;
{&lt;br /&gt;
	Class1* p;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как переключить раскладку в другом (то есть в активном) процессе?===&lt;br /&gt;
Использовать функции:&lt;br /&gt;
   GetKeyboardLayout - определить текущую раскладку&lt;br /&gt;
   LoadKeyboardLayout - загрузить новую раскладку&lt;br /&gt;
&lt;br /&gt;
см.также&lt;br /&gt;
   VerLanguageName - получить строку с описанием языка&lt;br /&gt;
&lt;br /&gt;
(подробности - в MSDN)&lt;br /&gt;
===Как получить хендл контрола Edit зная его ID?===&lt;br /&gt;
Пусть контрол лежит на окне CMyWnd&lt;br /&gt;
Тогда:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void CMyWnd::некая_процедура()&lt;br /&gt;
{&lt;br /&gt;
	//для MFC&lt;br /&gt;
	CEdit* ed=(CEdit* ) GetDlgItem(ID_EDIT1);&lt;br /&gt;
	HWND hwnd=ed-&amp;gt;GetSafeHwnd();&lt;br /&gt;
	...&lt;br /&gt;
	&lt;br /&gt;
	//для Win32 API&lt;br /&gt;
	HWND hwnd=GetDlgItem(m_hWnd,ID_EDIT1);&lt;br /&gt;
	...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Как из дочернего окна закрыть приложение?===&lt;br /&gt;
Нужно послать родительскому окну (*pParent) сообщение WM_CLOSE:&lt;br /&gt;
 pParent-&amp;gt;PostMessage(WM_CLOSE);//MFC&lt;br /&gt;
или&lt;br /&gt;
 ::PostMessage(pParent-&amp;gt;m_hWnd,WM_CLOSE,(WPARAM)0,(LPARAM)0);//API&lt;br /&gt;
===Как корректно перевести BSTR в CString и наоборот?===&lt;br /&gt;
Нужно просто присвоить переменной типа CString переменную типа BSTR.&lt;br /&gt;
Оператор = класса CString сам всё переведёт.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//указатель на будущий буфер с BSTR.&lt;br /&gt;
//	(По сути, BSTR определён как &lt;br /&gt;
//	typedef WCHAR* BSTR;&lt;br /&gt;
//	то есть указатель на 16-битный символ юникод)&lt;br /&gt;
	&lt;br /&gt;
BSTR bstrHE=0;&lt;br /&gt;
	&lt;br /&gt;
CString Str=&amp;quot;мой текст&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
//Выделить память и загрузить адрес блока в bstrHE&lt;br /&gt;
bstrHE=Str.AllocSysString();&lt;br /&gt;
	&lt;br /&gt;
//...	&lt;br /&gt;
//тут работаем с bstrHE[]&lt;br /&gt;
//...&lt;br /&gt;
	&lt;br /&gt;
//освобождаем память&lt;br /&gt;
SysFreeString(bstrHE);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Как получить доступ к графическим ресурсам элементов текущей темы оформления Windows?===&lt;br /&gt;
Использовать функции&lt;br /&gt;
&lt;br /&gt;
OpenThemeData()&lt;br /&gt;
DrawThemeBackground()&lt;br /&gt;
DrawFrameControl()&lt;br /&gt;
CloseThemeData().&lt;br /&gt;
&lt;br /&gt;
(подробности - в MSDN)&lt;br /&gt;
===Имеется класс , производный от CDialog. Когда диалог в фокусе, нажатие на Enter или Esc приводит к закрытию диалога. Как это запретить?===&lt;br /&gt;
При нажатии Enter происходит выполнение команды IDOK,&lt;br /&gt;
при нажатии Esc - IDCANCEL.&lt;br /&gt;
Нужно переопределить в классе виртуальные функции OnOk() и OnCancel(),&lt;br /&gt;
которые соответственно вызываются для этих команд. При помощи&lt;br /&gt;
визарда эти функции добавить можно так: Положить на диалог две кнопки&lt;br /&gt;
с идентификаторами IDOK и IDCANCEL (при создании нового диалога они там&lt;br /&gt;
есть сразу), затем двойной клик по кнопке добавляет соответствующий&lt;br /&gt;
обработчик. В обработчиках надо удалить вызовы СDialog::OnOK() и&lt;br /&gt;
CDialog::OnCancel(), тогда диалог закрываться не будет.&lt;br /&gt;
Однако тогда диалог станет невозможно закрыть кнопкой с крестиком  :)&lt;br /&gt;
&lt;br /&gt;
Лечить так: добавить обработчик сообщения WM_CLOSE - OnClose(), и в нём&lt;br /&gt;
сделать вызов OnOk() или OnCancel() :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void CPlayersPropsDialog::OnClose() &lt;br /&gt;
{&lt;br /&gt;
	CDialog::OnClose();&lt;br /&gt;
	CDialog::OnCancel();//добавлено&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===VC++6. Я написал простейший макрос, а компилятор на него ругается. Ума не приложу, что за глюк?===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	#define my_macr(x,y,z) \&lt;br /&gt;
		z=\&lt;br /&gt;
		(x+y)*\&lt;br /&gt;
		(x-y)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Скорее всего после одного из символов соединения строк &amp;quot;\&amp;quot; имеется&lt;br /&gt;
пробел или табуляция. Их надо удалить. Можно найти их &amp;quot;наощупь&amp;quot;, а&lt;br /&gt;
можно включить показ непечатных символов в студии. Найти эту команду&lt;br /&gt;
можно так:&lt;br /&gt;
Tools-&amp;gt;Customize...-&amp;gt;вкладка Commands. В окошке Category выбрать&lt;br /&gt;
&amp;quot;Edit&amp;quot;, и среди кнопок справа найти кнопку, на которой написано &amp;quot;a.b&amp;quot;&lt;br /&gt;
Эту кнопку надо перетащить на одну из панелей инструментов студии.&lt;br /&gt;
&lt;br /&gt;
===Как получить список всех процесов, включая idle?===&lt;br /&gt;
Использовать функции&lt;br /&gt;
Process32First()&lt;br /&gt;
Precess32Next()&lt;br /&gt;
&lt;br /&gt;
===Как программно установить переменные окружения?===&lt;br /&gt;
Чтобы добавить или изменить их программно, необходимо воспользоваться&lt;br /&gt;
ключом реестра HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\&lt;br /&gt;
Session Manager\Environment, а затем отправить широковещательное&lt;br /&gt;
сообщение WM_SETTINGCHANGE. Это позволит приложениям узнать об&lt;br /&gt;
изменениях:&lt;br /&gt;
&lt;br /&gt;
::SendMessage(HWND_BROADCAST,WM_SETTINGCHANGE,0,0);&lt;br /&gt;
===Как сделать, чтобы у окна был черный фон?===&lt;br /&gt;
переопределить обработчик сообщения WM_CTLCOLOR - OnCtlColor() :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CBrush br(RGB(0,0,0));&lt;br /&gt;
	&lt;br /&gt;
HBRUSH CMyDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) &lt;br /&gt;
{&lt;br /&gt;
	HBRUSH hbr = CMyDlg::OnCtlColor(pDC, pWnd, nCtlColor);&lt;br /&gt;
	&lt;br /&gt;
	//фон диалога (или вьюшки)&lt;br /&gt;
	if(nCtlColor==CTLCOLOR_DLG)&lt;br /&gt;
	{&lt;br /&gt;
		return (HBRUSH)br;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	//фон статиков (если нужно)&lt;br /&gt;
	if(nCtlColor==CTLCOLOR_STATIC)&lt;br /&gt;
	{&lt;br /&gt;
		//делаем фон текста статика прозрачным&lt;br /&gt;
		pDC-&amp;gt;SetBkMode(TRANSPARENT);&lt;br /&gt;
		return (HBRUSH)br;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	return hbr;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Почему на моем компьютере экзешник, созданный в MFC запускается, а на других компьютерах - нет? Требует какую-то  dll-ку.===&lt;br /&gt;
Нужно выбирать режим Release :&lt;br /&gt;
&lt;br /&gt;
Menu-&amp;gt;Build-&amp;gt;Configurations...-&amp;gt;Release,&lt;br /&gt;
&lt;br /&gt;
и экзешник, соответственно, брать из папки Release проекта&lt;br /&gt;
===Как в диалог добавить меню?===&lt;br /&gt;
Надо сделать в ресурсах меню, затем вставить в диалог:&lt;br /&gt;
&lt;br /&gt;
открыть в редакторе диалог, в свойствах (во вкладке General, окошко Menu) указать идентивикатор ресурса меню.&lt;br /&gt;
При помощи визарда добавить для меню обработчики OnCommand() и OnUpdateСommand().&lt;br /&gt;
===Я добавил визардом меню в диалог. Добавил обработчики для пунктов меню. Пункты работают, но OnUpdate для пунктов не вызывается - то есть не получается ни затенить, ни чек поставить. Что делать?===&lt;br /&gt;
В диалоге у меню апдейта не происходит сам, в отличие от мейнфрейма.&lt;br /&gt;
Для этого нужно сделать самим апдейт в обработчике сообщения WM_KICKIDLE.&lt;br /&gt;
Визардом обработчик не добавляется, поэтому можно переопределить виртуальную DefWindowProc() и там обработать:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;afxpriv.h&amp;gt;	//этот файл надо включить, там определёна WM_KICKIDLE&lt;br /&gt;
&lt;br /&gt;
LRESULT CMyDialog::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam) &lt;br /&gt;
{&lt;br /&gt;
	if(message==WM_KICKIDLE)&lt;br /&gt;
	{&lt;br /&gt;
		//делаем апдейт для всех пунктов меню&lt;br /&gt;
		CMenu* pMainMenu=GetMenu();&lt;br /&gt;
		if(pMainMenu)&lt;br /&gt;
		{&lt;br /&gt;
			CCmdUI cmdUI;&lt;br /&gt;
			for (UINT n=0; n &amp;lt; pMainMenu-&amp;gt;GetMenuItemCount(); ++n)&lt;br /&gt;
			{&lt;br /&gt;
				CMenu* pSubMenu = pMainMenu-&amp;gt;GetSubMenu(n);&lt;br /&gt;
				if(!pSubMenu)continue;&lt;br /&gt;
	&lt;br /&gt;
				cmdUI.m_nIndexMax = pSubMenu-&amp;gt;GetMenuItemCount();&lt;br /&gt;
				for (UINT i = 0; i &amp;lt; cmdUI.m_nIndexMax;++i)&lt;br /&gt;
				{&lt;br /&gt;
					cmdUI.m_nIndex = i;&lt;br /&gt;
					cmdUI.m_nID = pSubMenu-&amp;gt;GetMenuItemID(i);&lt;br /&gt;
					cmdUI.m_pMenu = pSubMenu;&lt;br /&gt;
					cmdUI.DoUpdate(this, FALSE);&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	return CDialog::DefWindowProc(message, wParam, lParam);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Как на Visual C++ 6.0 в Главном окне отключить системное меню (в левом верхнем углу) и кнопки(в правом верхнем углу)?===&lt;br /&gt;
При создании окна нужно убрать стиль WS_SYSMENU&lt;br /&gt;
(теперь пользователь корректно может закрыть окно только Alt+F4,&lt;br /&gt;
ну или если вы предоставите ему дополнительную возможность сделать это)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пример 1. (для SDI, MDI)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//этот обработчик уже добавлен визардом&lt;br /&gt;
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT&amp;amp; cs)&lt;br /&gt;
{&lt;br /&gt;
	if( !CFrameWnd::PreCreateWindow(cs) )&lt;br /&gt;
		return FALSE;&lt;br /&gt;
	// TODO: Modify the Window class or styles here by modifying&lt;br /&gt;
	//  the CREATESTRUCT cs&lt;br /&gt;
&lt;br /&gt;
	///////////////////////////////&lt;br /&gt;
	//добавленная часть&lt;br /&gt;
	{&lt;br /&gt;
		//убираем стиль&lt;br /&gt;
		cs.style&amp;amp;=~WS_SYSMENU;&lt;br /&gt;
	}&lt;br /&gt;
	///////////////////////////////&lt;br /&gt;
&lt;br /&gt;
	return TRUE;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Пример 2. (для диалога)&lt;br /&gt;
Если диалог описан в ресурсах, то в свойствах диалога убрать галочки&lt;br /&gt;
  &amp;quot;System menu&amp;quot;&lt;br /&gt;
  &amp;quot;Minimize box&amp;quot;&lt;br /&gt;
  &amp;quot;Maximize box&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===Хочу сделать так, чтобы пользователь не мог нажать на кнопку, пока программа не разрешит.===&lt;br /&gt;
Нужно применить метод класса CWnd::EnableWindow(...) для кнопки.&lt;br /&gt;
Значение параметра 0 делает кнопку неактивной, 1 - делает активной.&lt;br /&gt;
(кстате, не только для кнопки можно, а для любого класса, производного&lt;br /&gt;
от класса CWnd)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пусть имеется некий диалог, на нём лежит кнопка c ID == IDC_1.&lt;br /&gt;
в любом месте кода диалога (кроме конструктора и деструктора , хотя, если&lt;br /&gt;
проверить наличие валидного хендла диалога, как в примере, то ничего&lt;br /&gt;
страшного не будет и там)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//делаем кнопку неактивной&lt;br /&gt;
if(m_hWnd)&lt;br /&gt;
{&lt;br /&gt;
	CWnd* pw=0;&lt;br /&gt;
	pw=GetDlgItem(IDC_1);&lt;br /&gt;
	if(pw)pw-&amp;gt;EnableWindow(0);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Что означают сообщения, которые студия выводит при компиляции, вроде таких : Loaded 'C:\WINDOWS\SYSTEM\WSOCK32.DLL', no matching symbolic information found. ===&lt;br /&gt;
Это строка говорит о том, что студия не смогла найти отладочные&lt;br /&gt;
символы для WSOCK32.DLL. В этом нет ничего страшного, просто при наличии&lt;br /&gt;
отладочных символов в процессе отладки можно получить доступ к именам&lt;br /&gt;
функции из системных DLL. Например, вместо&lt;br /&gt;
 KERNEL32! 0x77E8B184() -&lt;br /&gt;
 увидим&lt;br /&gt;
 KERNEL32!CreateThread.&lt;br /&gt;
===Как обработать сообщения, которое приходит к некому контролу (скажем CEdit)?===&lt;br /&gt;
Нужно произвести от CEdit свой класс, и в виртуальной процедуре класса WindowProc перехватить нужные сообщения.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
virtual LRESULT WindowProc(&lt;br /&gt;
   UINT message,&lt;br /&gt;
   WPARAM wParam,&lt;br /&gt;
   LPARAM lParam &lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Пример. Полностью выключаем, скажем, обработку сообщения WM_CHAR&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	LRESULT CMyEdit::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) &lt;br /&gt;
	{&lt;br /&gt;
		switch(message)&lt;br /&gt;
		{&lt;br /&gt;
			case WM_CHAR:&lt;br /&gt;
			{&lt;br /&gt;
				return 0;&lt;br /&gt;
			}&lt;br /&gt;
			break;&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		return CEdit::WindowProc(message, wParam, lParam);&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Чтобы связать экземпляр класса с контролом на форме, добавьте визардом для&lt;br /&gt;
контрола переменную класса (выбрав не Value а Control).&lt;br /&gt;
&lt;br /&gt;
===Как настроить количество пробелов в табуляции?===&lt;br /&gt;
Tools-&amp;gt;Options-&amp;gt;Tabs-&amp;gt;Insert Spaces&lt;br /&gt;
(или  правой кнопкой мыши по тексту-&amp;gt; properties)&lt;br /&gt;
===Как автоматически расставить отступы?===&lt;br /&gt;
Выделить текст для форматирования, нажать Alt+F8&lt;br /&gt;
&lt;br /&gt;
Есть ещё программа Artistic Style, которая занимается&lt;br /&gt;
переформатированием кода&lt;br /&gt;
http://sourceforge.net/projects/astyle/&lt;br /&gt;
===Поиск границ блока===&lt;br /&gt;
&amp;quot;CTRL+ }&amp;quot; ищет парную фигурную скобку в тексте и переходит на неё&lt;br /&gt;
===Вертикальное выделение текста===&lt;br /&gt;
&amp;quot;Alt + выделение мышкой&amp;quot; - позволяет выделять вертикальные фрагменты текста&lt;br /&gt;
===Как узнать количество установленных в CListCtrl столбцов?===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CListCtrl* pL=...; //указатель на переменную-контрол&lt;br /&gt;
&lt;br /&gt;
int count=pL-&amp;gt;GetHeaderCtrl()-&amp;gt;GetItemCount();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Как получить иконку приложения?===&lt;br /&gt;
Если приложение запущено, то нужно найти его главное окно и&lt;br /&gt;
послать ему сообщение WM_GETICON.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//функция возвращант хендл иконки &lt;br /&gt;
LRESULT SendMessage(hWnd, WM_GETICON, wParam, 0);&lt;br /&gt;
&lt;br /&gt;
//hWnd == хендл окна приложения&lt;br /&gt;
//wParam == &lt;br /&gt;
//	1)==ICON_BIG - получить большую иконку&lt;br /&gt;
//	2)==ICON_SMALL - получить маленькую иконку&lt;br /&gt;
//	3)==ICON_SMALL2 - получить маленькую иконку, если она определена&lt;br /&gt;
//				в приложении. Если её нет, то маленькую иконку, &lt;br /&gt;
//				сгенерированную системой из большой иконки&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как в CString можно найти или вырезать часть строки?===&lt;br /&gt;
есть такие методы в CString:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//вырезает кусок строки&lt;br /&gt;
CString Mid(int nFirst) const;&lt;br /&gt;
CString Mid(int nFirst,  int nCount) const;&lt;br /&gt;
&lt;br /&gt;
//возвращает кусок строки (сначала или с конца)&lt;br /&gt;
CString Left(int nCount ) const;&lt;br /&gt;
CString Right(int nCount ) const;&lt;br /&gt;
&lt;br /&gt;
//возвращает начальный кусок строки, в котором есть только&lt;br /&gt;
//символы из набора,представленного в lpszCharSet&lt;br /&gt;
CString SpanIncluding(LPCTSTR lpszCharSet ) const;&lt;br /&gt;
&lt;br /&gt;
//возвращает начальный кусок строки, в котором нет&lt;br /&gt;
//символов из набора,представленного в lpszCharSet&lt;br /&gt;
CString SpanExcluding(LPCTSTR lpszCharSet ) const; &lt;br /&gt;
&lt;br /&gt;
//убирает &amp;quot;пробелоподобные&amp;quot; символы из самого начала строки&lt;br /&gt;
//(то есть - пробел, табуляцию (\t) , возврат каретки, перевод строки (/r/n))&lt;br /&gt;
void TrimLeft();&lt;br /&gt;
//убирает все повторы символа из самого начала строки&lt;br /&gt;
void TrimLeft(TCHAR chTarget );&lt;br /&gt;
//убирает из самого начала строки все символа из набора lpszTargets &lt;br /&gt;
void TrimLeft(LPCTSTR lpszTargets ); &lt;br /&gt;
&lt;br /&gt;
void TrimRight();&lt;br /&gt;
void TrimRight(TCHAR chTarget );&lt;br /&gt;
void TrimRight(LPCTSTR lpszTargets ); &lt;br /&gt;
&lt;br /&gt;
//поиск в строке&lt;br /&gt;
int Find( TCHAR ch ) const;&lt;br /&gt;
int Find( LPCTSTR lpszSub ) const;&lt;br /&gt;
int Find( TCHAR ch, int nStart ) const;&lt;br /&gt;
int Find( LPCTSTR pstr, int nStart ) const;&lt;br /&gt;
&lt;br /&gt;
//поиск, начиная с конца&lt;br /&gt;
int ReverseFind( TCHAR ch ) const;&lt;br /&gt;
&lt;br /&gt;
//поиск позиции первого символа, одного из набора,&lt;br /&gt;
// представленного в lpszCharSet&lt;br /&gt;
int FindOneOf( LPCTSTR lpszCharSet ) const;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Есть у меня CListBox и я в ходе выполнения программы добавляю в него строки. Но я не могу посмотреть что именно добавляется. Вывод результатов происходит в конце выполнения процедуры...===&lt;br /&gt;
Если нужно делать принудительную перерисовку окна во время&lt;br /&gt;
длительных вычислений, то нужно вызывать для окна, которое&lt;br /&gt;
надо перерисовать метод&lt;br /&gt;
  RedrawWindow()&lt;br /&gt;
с параметрами по умолчанию, или пару&lt;br /&gt;
  Invalidate(0);&lt;br /&gt;
  UpdateWindow();&lt;br /&gt;
Это приводит к пометке всего окна к перерисовке и отправлению&lt;br /&gt;
сообщения WM_PAINT в оконную процедуру в обход очереди&lt;br /&gt;
сообщений, вызывая немедленную перерисовку окна.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CWnd* pw=...;//окно , которое надо перерисовывать&lt;br /&gt;
&lt;br /&gt;
for(int i=0;i&amp;lt;10000)&lt;br /&gt;
{&lt;br /&gt;
	//меняется содержимое окна&lt;br /&gt;
	//...&lt;br /&gt;
&lt;br /&gt;
	//немедленная перерисовка&lt;br /&gt;
	pw-&amp;gt;Invalidate(0);&lt;br /&gt;
	pw-&amp;gt;UpdateWindow();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Я написал DLL , которую используют несколько приложений. Всё вроде работает, но когда происходит очередной вызов функции из DLL , почему то данные в функции обнуляются. С чем это связано ?===&lt;br /&gt;
Переменные и массивы в DLL, содержимое которых должно использоваться несколькими процессами, должны объявляться статическими. Статическая переменная или массив инициализируются только один раз в момент загрузки DLL.&lt;br /&gt;
Пример:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DWORD calltest()&lt;br /&gt;
{&lt;br /&gt;
	//будет выполнено только при первом вызове&lt;br /&gt;
	static DWORD callcount=0;&lt;br /&gt;
	static DWORD str[1000]={0}; &lt;br /&gt;
&lt;br /&gt;
	//будет выполняться каждый раз&lt;br /&gt;
	return ++callcount;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как открыть проекцию файла в память и как с ней работать?===&lt;br /&gt;
Как открыть проекцию файла в память и как с ней работать?&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HANDLE CreateFileMapping(&lt;br /&gt;
  HANDLE hFile,	//хендл уже открытого файла&lt;br /&gt;
  LPSECURITY_ATTRIBUTES lpAttributes,&lt;br /&gt;
  DWORD flProtect,	//способ открытия проекции&lt;br /&gt;
  DWORD dwMaximumSizeHigh,	//размер файла (старшие 4 байта , обычно==0)&lt;br /&gt;
  DWORD dwMaximumSizeLow,	//размер файла (младшие 4 байта)&lt;br /&gt;
  LPCTSTR lpName&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Доступ к созданной проекции производится процедурой&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LPVOID MapViewOfFile(&lt;br /&gt;
  HANDLE hFileMappingObject, //хендл проекции&lt;br /&gt;
  DWORD dwDesiredAccess,	//способ работы с проекцией&lt;br /&gt;
  DWORD dwFileOffsetHigh,&lt;br /&gt;
  DWORD dwFileOffsetLow, //смещение от начала файла (младшие 4 байта)&lt;br /&gt;
  SIZE_T dwNumberOfBytesToMap //длина в байтах (если ==0 - то весь файл)&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
далее с файлом можно работать как с обычным массивом в памяти.&lt;br /&gt;
&lt;br /&gt;
После работы с проекцией , её надо освободить процедурой&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
BOOL UnmapViewOfFile(&lt;br /&gt;
  LPCVOID lpBaseAddress //адрес, который вернула процедура MapViewOfFile&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Пример.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HANDLE hMapFile=0;//для проекции&lt;br /&gt;
&lt;br /&gt;
HANDLE hFile=...;//хендл уже открытого файла&lt;br /&gt;
DWORD dwdFileLen=...;//размер открытого файла&lt;br /&gt;
&lt;br /&gt;
//создаём проекцию &amp;quot;только для чтения&amp;quot;&lt;br /&gt;
hMapFile=::CreateFileMapping(hFile,0,PAGE_READONLY,0,dwdFileLen,0);&lt;br /&gt;
&lt;br /&gt;
//хендл hFile можно закрыть уже здесь, в принципе,&lt;br /&gt;
//но мы сделаем это позже&lt;br /&gt;
&lt;br /&gt;
//получаем доступ к проекции (тоже только для чтения)&lt;br /&gt;
BYTE* pbyFile=(BYTE*)::MapViewOfFile(hMapFile,FILE_MAP_READ,0,0,0);&lt;br /&gt;
&lt;br /&gt;
///////////////////&lt;br /&gt;
//тут работаем с массивом pbyFile[dwdFileLen] как с обычным,&lt;br /&gt;
//только не забываем, что он открыт только для чтения&lt;br /&gt;
//...&lt;br /&gt;
//...&lt;br /&gt;
//...&lt;br /&gt;
///////////////////&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//отключаем файл данных от адресного пространства&lt;br /&gt;
UnmapViewOfFile(pbyFile);&lt;br /&gt;
&lt;br /&gt;
//освобождаем хендл проекции&lt;br /&gt;
CloseHandle(hMapFile)&lt;br /&gt;
&lt;br /&gt;
//освобождаем хендл открытого файла&lt;br /&gt;
CloseHandle(hFile);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Использую MFC Grid control 2.25 , не получается отобразить картинку в ячейке. Как это делается ?===&lt;br /&gt;
Нужно создать список изображений (CImageList) , затем передать указатель на список в контрол. Поскольку контрол лишь копирует указатель , список должен создаваться динамически, либо быть членом класса, экземпляр которого существует всё время работы контрола.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 m_GridMarket&lt;br /&gt;
CImageList m_ImageList;&lt;br /&gt;
CGridCtrL m_Grid1&lt;br /&gt;
...&lt;br /&gt;
...&lt;br /&gt;
//неким образом создаётся список&lt;br /&gt;
m_ImageList.Create(...);&lt;br /&gt;
//...&lt;br /&gt;
&lt;br /&gt;
//вставляем в контрол&lt;br /&gt;
m_Grid1.SetImageList(&amp;amp;m_ImageList);&lt;br /&gt;
&lt;br /&gt;
//&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как при помощи IPicture отобразить картинку из файла? ===&lt;br /&gt;
Пример - несложная функция, отображающая картинку из файла&lt;br /&gt;
&lt;br /&gt;
поддерживаются форматы&lt;br /&gt;
BMP, GIF, JPEG, PNG, TIFF, EMF&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;quot;atlconv.h&amp;quot;&lt;br /&gt;
#define HandleIsValid(H) (H!=(HANDLE)-1 &amp;amp;&amp;amp; H!=(HANDLE)0)&lt;br /&gt;
&lt;br /&gt;
//*pDestDC - CDC, на который предполагается вывод картинки&lt;br /&gt;
//pchzFilePath - путь к файлу&lt;br /&gt;
//pWid - (возвращает) ширина картинки&lt;br /&gt;
//pHig - (возвращает) высота картинки&lt;br /&gt;
bool DrawBitmapFromFile(CDC* pDestDC,const char* pchzFilePath,int *pWid=0,int *pHig=0)&lt;br /&gt;
{&lt;br /&gt;
	bool result=false;&lt;br /&gt;
&lt;br /&gt;
	if(pWid)*pWid=0;&lt;br /&gt;
	if(pHig)*pHig=0;&lt;br /&gt;
&lt;br /&gt;
	int Wid=0;&lt;br /&gt;
	int Hig=0;&lt;br /&gt;
&lt;br /&gt;
	IPicture* pPic=0;&lt;br /&gt;
	try&lt;br /&gt;
	{&lt;br /&gt;
		IPicture* ptmpPic=0;&lt;br /&gt;
		USES_CONVERSION;&lt;br /&gt;
		HRESULT hr;&lt;br /&gt;
&lt;br /&gt;
		CString txt=pchzFilePath;&lt;br /&gt;
		hr= ::OleLoadPicturePath(&lt;br /&gt;
			const_cast&amp;lt;LPOLESTR&amp;gt;(T2COLE(txt)),&lt;br /&gt;
			0,0,0,IID_IPicture,&lt;br /&gt;
			reinterpret_cast&amp;lt;void **&amp;gt;(&amp;amp;ptmpPic)&lt;br /&gt;
			);&lt;br /&gt;
&lt;br /&gt;
		if(hr==S_OK &amp;amp;&amp;amp; ptmpPic)&lt;br /&gt;
		{&lt;br /&gt;
			pPic=ptmpPic;&lt;br /&gt;
		}&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			throw 0;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		OLE_XPOS_HIMETRIC cxSrc;&lt;br /&gt;
		OLE_YPOS_HIMETRIC cySrc;&lt;br /&gt;
&lt;br /&gt;
		if(S_OK!=pPic-&amp;gt;get_Width(&amp;amp;cxSrc))throw 0;&lt;br /&gt;
		if(S_OK!=pPic-&amp;gt;get_Height(&amp;amp;cySrc))throw 0;&lt;br /&gt;
&lt;br /&gt;
		Wid=cxSrc/26;&lt;br /&gt;
		Hig=cySrc/26;&lt;br /&gt;
&lt;br /&gt;
		//рисуем&lt;br /&gt;
		if(S_OK !=pPic-&amp;gt;Render(pDestDC-&amp;gt;GetSafeHdc(),&lt;br /&gt;
			0,Hig,Wid,-Hig,0,0,cxSrc,cySrc,0))throw 0;&lt;br /&gt;
	}&lt;br /&gt;
	catch(...)&lt;br /&gt;
	{&lt;br /&gt;
		result=false;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if(pPic)&lt;br /&gt;
	{&lt;br /&gt;
		pPic-&amp;gt;Release();&lt;br /&gt;
		pPic=0;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	if(pWid)*pWid=Wid;&lt;br /&gt;
	if(pHig)*pHig=Hig;&lt;br /&gt;
&lt;br /&gt;
	return result;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===У меня модальное диалоговое окно, в нем поле редактирования мультилайновое, т.е. чтобы перейти на новую строку надо нажать ентер, но вызывается стандартный обработчик диалогового окна. Подскажите, что делать?===&lt;br /&gt;
Нужно в редакторе ресурсов поставить для CEdit окошка галочку&lt;br /&gt;
свойства WantReturn,&lt;br /&gt;
&lt;br /&gt;
или добавить ES_WANTRETURN при создании CEdit контрола динамически.&lt;br /&gt;
===Как выводят картинку-логотип(splash screen) при запуске программы? То есть, когда загружается программа на экран выводится картинка, потом она исчезает(загрузка программы закончена) и пользователь может приступать к работе ===&lt;br /&gt;
Для этого используется класс, производный от CDialog. Этот диалог после создания показывает себя на экран, выводя на себя рисунок. Также запускает таймет, по срабатывани которого диалог гасится. Создаётся диалог InitInstance приложения.&lt;br /&gt;
&lt;br /&gt;
В VC6++ также есть уже готовый компонент&lt;br /&gt;
Project-&amp;gt;Add To Project -&amp;gt; Components and Controls-&amp;gt;(в папке &amp;quot;Visual C++ Components&amp;quot; есть SplashScreen.)&lt;br /&gt;
===Как сделать, чтобы при выпадении списка у ComboBox была не одна строка, а больше, вроде все свойства покрутил, не помогает Вместо выпадающего списка одна строка и скролл...===&lt;br /&gt;
В редакторе ресурсов надо щелкнуть в комбобоксе на треугольнике - появляется рамка для растягивания вниз - размер выпадающего списка.&lt;br /&gt;
===В VC++.net , что делать после того, как на форму установил ActiiveX ListView, как объявить класс и переменную для этого элемента?===&lt;br /&gt;
Щёлкнуть правой кнопкой мыши на элементе , в меню - add variable или add class&lt;br /&gt;
===Как вставить данные в буфер обмена (Clipboard) ? Как их оттуда вытащить ?===&lt;br /&gt;
&lt;br /&gt;
1) копирование в буфер обмена:&lt;br /&gt;
&lt;br /&gt;
  1.Готовим данные&lt;br /&gt;
    а.Выделяем память из кучи,  вызывая GlobalAlloc()&lt;br /&gt;
    б.Получаем указатель на выделенную память, вызывая GlobalLock()&lt;br /&gt;
    в.Заполняем данные&lt;br /&gt;
    г.Освобождаем указатель , вызывая GlobalUnlock();&lt;br /&gt;
&lt;br /&gt;
  2.Открываем буфер обмена , вызывая OpenClipboard();&lt;br /&gt;
  3.Очищаем буфер, вызывая EmptyClipboard();&lt;br /&gt;
  4.Вызываем SetClipboardData() один раз для каждого формата&lt;br /&gt;
      вставляемых данных (имеется в виду - если одни и те же&lt;br /&gt;
      данные представлены в разных форматах, и приложение&lt;br /&gt;
      может эти форматы создать)&lt;br /&gt;
  5.Закрываем буфер, вызывая CloseClipboard();&lt;br /&gt;
  6.ВЫЗЫВАТЬ GlobalFree() НЕ НУЖНО , в этом случае это&lt;br /&gt;
      предоставлено системе&lt;br /&gt;
&lt;br /&gt;
Скажем, хотим поместить в буфер обмена туда текст.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	//готовим данные&lt;br /&gt;
	//выделяем из кучи память для данных&lt;br /&gt;
	HANDLE hglbCopy = GlobalAlloc(GMEM_MOVEABLE,10);&lt;br /&gt;
	if(!hglbCopy)return;&lt;br /&gt;
&lt;br /&gt;
	//получаем указатель&lt;br /&gt;
	void* lpStr = GlobalLock(hglbCopy);&lt;br /&gt;
	if(!lpStr)return;&lt;br /&gt;
&lt;br /&gt;
	//заполняем данные&lt;br /&gt;
	strcpy((char*)lpStr,&amp;quot;my text&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	//освобождаем указатель&lt;br /&gt;
	GlobalUnlock(hglbCopy);&lt;br /&gt;
	lpStr=0;&lt;br /&gt;
&lt;br /&gt;
	//открываем буфер обмена&lt;br /&gt;
	OpenClipboard();&lt;br /&gt;
	//очищаем&lt;br /&gt;
	EmptyClipboard();&lt;br /&gt;
&lt;br /&gt;
	//текстовый формат&lt;br /&gt;
	SetClipboardData(CF_TEXT,hglbCopy);&lt;br /&gt;
&lt;br /&gt;
	//закрываем буфер&lt;br /&gt;
	CloseClipboard();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
2) извлечение из буфера обмена&lt;br /&gt;
&lt;br /&gt;
  1.Проверяем, что поддерживается нужный формат данных,&lt;br /&gt;
      вызывая IsClipboardFormatAvailable()&lt;br /&gt;
  2.Открываем буфер обмена , вызывая OpenClipboard();&lt;br /&gt;
  3.Достаём данные&lt;br /&gt;
   а.Получаем из буфера хендл требуемого формата,&lt;br /&gt;
      вызывая GetClipboardData()&lt;br /&gt;
    б.Получаем указатель на выделенную память, вызывая GlobalLock()&lt;br /&gt;
    в.Работаем с данными&lt;br /&gt;
    г.Освобождаем указатель , вызывая GlobalUnlock();&lt;br /&gt;
  4.Закрываем буфер, вызывая CloseClipboard();&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	//Проверяем, что поддерживается нужный формат данных,&lt;br /&gt;
	if(!IsClipboardFormatAvailable(CF_TEXT))return;&lt;br /&gt;
&lt;br /&gt;
	//открываем буфер обмена&lt;br /&gt;
	OpenClipboard();&lt;br /&gt;
&lt;br /&gt;
	//достаём данные&lt;br /&gt;
&lt;br /&gt;
	//текстовый формат&lt;br /&gt;
	HANDLE hglbCopy = GetClipboardData(CF_TEXT);&lt;br /&gt;
	if(!hglbCopy)return;&lt;br /&gt;
&lt;br /&gt;
	//получаем указатель&lt;br /&gt;
	void* lpStr = GlobalLock(hglbCopy);&lt;br /&gt;
	if(!lpStr)return;&lt;br /&gt;
&lt;br /&gt;
	//читаем данные&lt;br /&gt;
	char data[10];&lt;br /&gt;
	memmove(data,lpStr,sizeof(data));&lt;br /&gt;
&lt;br /&gt;
	//освобождаем указатель&lt;br /&gt;
	GlobalUnlock(hglbCopy);&lt;br /&gt;
	lpStr=0;&lt;br /&gt;
&lt;br /&gt;
	//закрываем буфер&lt;br /&gt;
	CloseClipboard();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как получить полный путь к экзешнику из самой программы ?===&lt;br /&gt;
В командную строку первым параметром система всегда передаёт заключённый в кавычки полный путь к файлу запущенной программы Достаём путь таким образом :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
BOOL CMyApp::InitInstance()&lt;br /&gt;
{&lt;br /&gt;
	//добыча полного имени экзешника&lt;br /&gt;
	CString csFullExeName;&lt;br /&gt;
	{&lt;br /&gt;
		CString csAppName=GetCommandLine();&lt;br /&gt;
		csAppName.Delete(0,1);&lt;br /&gt;
		csAppName.Replace('\&amp;quot;','\0');&lt;br /&gt;
		csFullExeName=(const char*)csAppName;&lt;br /&gt;
	}&lt;br /&gt;
	//теперь csFullExeName - содержит искомый путь&lt;br /&gt;
&lt;br /&gt;
	//...&lt;br /&gt;
	//...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Каким способом можно exe файл может заменить самого себя? То есть, моя программа обновляется, например, через Internet, и хочет обновить свой exe-файл. Но так как он в данный момент запущен - это будет, естественно, запрещено. Как это можно проще всего сделать?===&lt;br /&gt;
Один из способов - сделать копию экзешника и из него обновиться&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define def_exeNAMEup	&amp;quot;c:\\myprog_update.exe&amp;quot;&lt;br /&gt;
#define def_exeNAMEdnld	&amp;quot;c:\\myprog_downloaded.exe&amp;quot;&lt;br /&gt;
#define def_keyUdate	&amp;quot;/update&amp;quot;&lt;br /&gt;
&lt;br /&gt;
void CTESTFAQApp::UpdateItself()&lt;br /&gt;
{&lt;br /&gt;
	//добыча полного имени экзешника&lt;br /&gt;
	CString csFullExeName;&lt;br /&gt;
	{&lt;br /&gt;
		CString csAppName=GetCommandLine();&lt;br /&gt;
		csAppName.Delete(0,1);&lt;br /&gt;
		csAppName.Replace('\&amp;quot;','\0');&lt;br /&gt;
		csFullExeName=(const char*)csAppName;&lt;br /&gt;
	}&lt;br /&gt;
	//теперь csFullExeName - содержит искомый путь&lt;br /&gt;
&lt;br /&gt;
	//делаем копию экзешника с другим именем&lt;br /&gt;
	CopyFile(csFullExeName,def_exeNAMEup,0);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	//передаём в параметры нового процесса ключ и путь к текущему файлу&lt;br /&gt;
	CString csParams=def_keyUdate;&lt;br /&gt;
	csParams+=&amp;quot; &amp;quot;;&lt;br /&gt;
	csParams+=csFullExeName;&lt;br /&gt;
&lt;br /&gt;
	//запускаем копию&lt;br /&gt;
	STARTUPINFO si;&lt;br /&gt;
	PROCESS_INFORMATION pi;&lt;br /&gt;
	ZeroMemory(&amp;amp;si,sizeof(si));&lt;br /&gt;
	si.cb = sizeof(si);&lt;br /&gt;
	ZeroMemory(&amp;amp;pi,sizeof(pi));&lt;br /&gt;
	if(CreateProcess(def_exeNAMEup,def_keyUdate,0,0,0,0,0,0,&amp;amp;si,&amp;amp;pi))&lt;br /&gt;
	{&lt;br /&gt;
		//завершаем текущий процесс&lt;br /&gt;
		ExitFromMyApp();&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void CTESTFAQApp::ExitFromMyApp()&lt;br /&gt;
{&lt;br /&gt;
	exit(0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
BOOL CTESTFAQApp::InitInstance()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
	//смотрим, не запустили ли для апдейта?&lt;br /&gt;
&lt;br /&gt;
	CString txt;&lt;br /&gt;
	txt=m_lpCmdLine;&lt;br /&gt;
	if(txt.Find(def_keyUdate)==0)&lt;br /&gt;
	{&lt;br /&gt;
		//делаем айдейт&lt;br /&gt;
		txt.Replace(def_keyUdate,&amp;quot;&amp;quot;);&lt;br /&gt;
		txt.TrimLeft();&lt;br /&gt;
&lt;br /&gt;
		CString csFullExeName=txt;&lt;br /&gt;
&lt;br /&gt;
		//берём откуда то уже скачанный файл обновления&lt;br /&gt;
		//...&lt;br /&gt;
		CString csFull_Downloaded_ExeName=def_exeNAMEdnld;&lt;br /&gt;
&lt;br /&gt;
		//копируем файл (обновляем старый то есть)&lt;br /&gt;
		CopyFile(csFull_Downloaded_ExeName,csFullExeName,0);&lt;br /&gt;
&lt;br /&gt;
		//запускаем обновлённого мученника&lt;br /&gt;
		STARTUPINFO si;&lt;br /&gt;
		PROCESS_INFORMATION pi;&lt;br /&gt;
		ZeroMemory(&amp;amp;si,sizeof(si));&lt;br /&gt;
		si.cb = sizeof(si);&lt;br /&gt;
		ZeroMemory(&amp;amp;pi,sizeof(pi));&lt;br /&gt;
		if(CreateProcess(csFullExeName,0,0,0,0,0,0,0,&amp;amp;si,&amp;amp;pi))&lt;br /&gt;
&lt;br /&gt;
		ExitFromMyApp();&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
	//...&lt;br /&gt;
	//...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Есть строка символов (страничка из Инета) в кодировке utf-8 (строка char*). Как мне ее получить в формате String&lt;br /&gt;
или в char* в кодировке ANSI (cp 1251) ?===&lt;br /&gt;
Можно перевести строку из UTF8 в Unicode, затем из Unicode в 1251&lt;br /&gt;
&lt;br /&gt;
Ниже приведена структура, содержащая процедуры перекодирования,&lt;br /&gt;
а также процедуру с примером использования&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//описание структуры&lt;br /&gt;
struct coder&lt;br /&gt;
{&lt;br /&gt;
	//utf8-&amp;gt;unicode&lt;br /&gt;
	static wchar_t* utf8_to_unicode__dontForgetDeleteArr(const char *utf8_string)&lt;br /&gt;
	{&lt;br /&gt;
		wchar_t* pRes=0;&lt;br /&gt;
		int res_len=0;&lt;br /&gt;
&lt;br /&gt;
		//тест на возможность преобразования&lt;br /&gt;
		res_len=MultiByteToWideChar(CP_UTF8,0,utf8_string,-1,0,0);&lt;br /&gt;
		if(!res_len)return 0;&lt;br /&gt;
&lt;br /&gt;
		//выделяем память&lt;br /&gt;
		pRes = new wchar_t[res_len];&lt;br /&gt;
		if(!pRes)return 0;&lt;br /&gt;
&lt;br /&gt;
		//преобразование&lt;br /&gt;
		if(!MultiByteToWideChar(CP_UTF8,0,utf8_string,-1,pRes,res_len))&lt;br /&gt;
		{&lt;br /&gt;
			delete [] pRes;&lt;br /&gt;
			return 0;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		return pRes;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	//unicode-&amp;gt;1251&lt;br /&gt;
	static char * unicode_to_1251__dontForgetDeleteArr(const wchar_t *unicode_string)&lt;br /&gt;
	{&lt;br /&gt;
		char* pRes=0;&lt;br /&gt;
		int res_len=0;&lt;br /&gt;
&lt;br /&gt;
		//тест на возможность преобразования&lt;br /&gt;
		res_len = WideCharToMultiByte(1251,0,unicode_string,-1,0,0,0,0);&lt;br /&gt;
		if(!res_len)return 0;&lt;br /&gt;
&lt;br /&gt;
		//выделяем память&lt;br /&gt;
		pRes=new char[res_len];&lt;br /&gt;
		if(!pRes)return 0;&lt;br /&gt;
&lt;br /&gt;
		//преобразование&lt;br /&gt;
		if(!WideCharToMultiByte(1251,0,unicode_string,-1,pRes,res_len,0,0))&lt;br /&gt;
		{&lt;br /&gt;
			delete [] pRes;&lt;br /&gt;
			return 0;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		return pRes;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	//процедура с примером&lt;br /&gt;
	static void Example()&lt;br /&gt;
	{&lt;br /&gt;
		wchar_t* unicode_string=0;&lt;br /&gt;
		char* cp1251_string=0;&lt;br /&gt;
&lt;br /&gt;
		//исходный текст&lt;br /&gt;
		char utf8_string[] = &amp;quot;UTF-8 + СЂСѓСЃСЃРєРёР№ С‚РµРєСЃС‚&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
		for(;;)&lt;br /&gt;
		{&lt;br /&gt;
&lt;br /&gt;
			unicode_string=utf8_to_unicode__dontForgetDeleteArr(utf8_string);&lt;br /&gt;
			if(!unicode_string)&lt;br /&gt;
			{&lt;br /&gt;
				AfxMessageBox(&amp;quot;Не удалось конвертировать в unicode!&amp;quot;);&lt;br /&gt;
				break;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			cp1251_string = unicode_to_1251__dontForgetDeleteArr(unicode_string);&lt;br /&gt;
&lt;br /&gt;
			if(!cp1251_string)&lt;br /&gt;
			{&lt;br /&gt;
				AfxMessageBox(&amp;quot;Не удалось конвертировать из unicode!&amp;quot;);&lt;br /&gt;
				break;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			break;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		//cp1251_string - результат&lt;br /&gt;
		AfxMessageBox(cp1251_string);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
		//не забываем удалить массивы&lt;br /&gt;
		if(unicode_string)&lt;br /&gt;
		{&lt;br /&gt;
			delete [] unicode_string;&lt;br /&gt;
			unicode_string=0;&lt;br /&gt;
		}&lt;br /&gt;
		if(cp1251_string)&lt;br /&gt;
		{&lt;br /&gt;
			delete [] cp1251_string;&lt;br /&gt;
			cp1251_string=0;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
//вызов примера&lt;br /&gt;
coder::Example();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как организовать взаимодействие программы на VC.net с Access-овской базой данных?===&lt;br /&gt;
Проще всего подключить ADO компоненты и сделать все на них.&lt;br /&gt;
Компоненты  ADO (ADODC,DATAGRID и т.п.) это ActiveX.&lt;br /&gt;
В редакторе ресурсов, во всплывающем меню, есть Insert ActiveX Control -&amp;gt; открывается список всех компоент,&lt;br /&gt;
зарегистрированых на машине. Нужно найти компоненты (Это компоненты от MS и они помечены (OLEDB)) и вставить их в диалог. Для того что бы иметь возможность управлять ими, нужно импортировать обертки для них, это делается при помощи ClassWisard, там есть импорт-&amp;gt;класс-&amp;gt;указать файл с компоентой (OSX).&lt;br /&gt;
Появляется список всех классов, объявленых внутри.&lt;br /&gt;
Проставляем галочки, нажимаем ОК.&lt;br /&gt;
&lt;br /&gt;
[[Category:FAQ]]&lt;/div&gt;</summary>
		<author><name>Mczim</name></author>	</entry>

	<entry>
		<id>https://wiki.shelek.ru/index.php?title=FAQ:WinAPI,_VCPP_Part_3&amp;diff=414</id>
		<title>FAQ:WinAPI, VCPP Part 3</title>
		<link rel="alternate" type="text/html" href="https://wiki.shelek.ru/index.php?title=FAQ:WinAPI,_VCPP_Part_3&amp;diff=414"/>
				<updated>2008-08-14T18:50:13Z</updated>
		
		<summary type="html">&lt;p&gt;Mczim: пробел перед знаком вопроса в заголовке&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Имеется приложение на основе CRichEditView. Как узнать, что пользователь меняет текст?===&lt;br /&gt;
Добавить обработчик сообщения EN_CHANGE. Сообщение генерируется CRichEditView каждый раз, когда пользователь изменяет текст в окне CRichEditView&lt;br /&gt;
===Чем метод CArray::GetSize отличается от метода CArray::GetCount?===&lt;br /&gt;
Абсолютно ничем. (Скорее всего, были предыдущие библиотеки, в которых функции, одинаковые по смыслу, имели разные имена. Поэтому в целях совместимости оставили оба)&lt;br /&gt;
===Как загрузить строку из ресурса?===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CString m_Temp;&lt;br /&gt;
m_Temp.LoadString(ID_MYSTRING);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как поменять иконку у элемента (item) в CListCtrl?===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//заполняем структуру LVITEM&lt;br /&gt;
LVITEM lvItem;&lt;br /&gt;
memset(&amp;amp;lvItem,0,sizeof(lvItem));&lt;br /&gt;
	&lt;br /&gt;
lvItem.mask = LVIF_IMAGE;//меняться будет картинка&lt;br /&gt;
lvItem.iItem = ...;// индекс элемента списка (Zero-based)&lt;br /&gt;
lvItem.iSubItem = 0;&lt;br /&gt;
lvItem.iImage = ...; //индекс иконки (из списка контрола)&lt;br /&gt;
	&lt;br /&gt;
pList-&amp;gt;SetItem(&amp;amp; lvItem);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Имеется класс Class1, содержащий мембер типа указатель на Class2. В Class2 также имеется указатель на Class1. Компилятор выдаёт ошибку. Что надо делать?===&lt;br /&gt;
Предварительно объявляем класс Class2. Тогда компилятору будет известно, что описание класса Class2 будет встречено дальше, и станет возможным объявление указателей на класс до описания самого класса.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Class2;//предопределение&lt;br /&gt;
	&lt;br /&gt;
Class1&lt;br /&gt;
{&lt;br /&gt;
	Class2* p;&lt;br /&gt;
};&lt;br /&gt;
	&lt;br /&gt;
Class2&lt;br /&gt;
{&lt;br /&gt;
	Class1* p;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как переключить раскладку в другом (то есть в активном) процессе?===&lt;br /&gt;
Использовать функции:&lt;br /&gt;
   GetKeyboardLayout - определить текущую раскладку&lt;br /&gt;
   LoadKeyboardLayout - загрузить новую раскладку&lt;br /&gt;
&lt;br /&gt;
см.также&lt;br /&gt;
   VerLanguageName - получить строку с описанием языка&lt;br /&gt;
&lt;br /&gt;
(подробности - в MSDN)&lt;br /&gt;
===Как получить хендл контрола Edit зная его ID?===&lt;br /&gt;
Пусть контрол лежит на окне CMyWnd&lt;br /&gt;
Тогда:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void CMyWnd::некая_процедура()&lt;br /&gt;
{&lt;br /&gt;
	//для MFC&lt;br /&gt;
	CEdit* ed=(CEdit* ) GetDlgItem(ID_EDIT1);&lt;br /&gt;
	HWND hwnd=ed-&amp;gt;GetSafeHwnd();&lt;br /&gt;
	...&lt;br /&gt;
	&lt;br /&gt;
	//для Win32 API&lt;br /&gt;
	HWND hwnd=GetDlgItem(m_hWnd,ID_EDIT1);&lt;br /&gt;
	...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Как из дочернего окна закрыть приложение?===&lt;br /&gt;
Нужно послать родительскому окну (*pParent) сообщение WM_CLOSE:&lt;br /&gt;
 pParent-&amp;gt;PostMessage(WM_CLOSE);//MFC&lt;br /&gt;
или&lt;br /&gt;
 ::PostMessage(pParent-&amp;gt;m_hWnd,WM_CLOSE,(WPARAM)0,(LPARAM)0);//API&lt;br /&gt;
===Как корректно перевести BSTR в CString и наоборот?===&lt;br /&gt;
Нужно просто присвоить переменной типа CString переменную типа BSTR.&lt;br /&gt;
Оператор = класса CString сам всё переведёт.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//указатель на будущий буфер с BSTR.&lt;br /&gt;
//	(По сути, BSTR определён как &lt;br /&gt;
//	typedef WCHAR* BSTR;&lt;br /&gt;
//	то есть указатель на 16-битный символ юникод)&lt;br /&gt;
	&lt;br /&gt;
BSTR bstrHE=0;&lt;br /&gt;
	&lt;br /&gt;
CString Str=&amp;quot;мой текст&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
//Выделить память и загрузить адрес блока в bstrHE&lt;br /&gt;
bstrHE=Str.AllocSysString();&lt;br /&gt;
	&lt;br /&gt;
//...	&lt;br /&gt;
//тут работаем с bstrHE[]&lt;br /&gt;
//...&lt;br /&gt;
	&lt;br /&gt;
//освобождаем память&lt;br /&gt;
SysFreeString(bstrHE);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Как получить доступ к графическим ресурсам элементов текущей темы оформления Windows?===&lt;br /&gt;
Использовать функции&lt;br /&gt;
&lt;br /&gt;
OpenThemeData()&lt;br /&gt;
DrawThemeBackground()&lt;br /&gt;
DrawFrameControl()&lt;br /&gt;
CloseThemeData().&lt;br /&gt;
&lt;br /&gt;
(подробности - в MSDN)&lt;br /&gt;
===Имеется класс , производный от CDialog. Когда диалог в фокусе, нажатие на Enter или Esc приводит к закрытию диалога. Как это запретить?===&lt;br /&gt;
При нажатии Enter происходит выполнение команды IDOK,&lt;br /&gt;
при нажатии Esc - IDCANCEL.&lt;br /&gt;
Нужно переопределить в классе виртуальные функции OnOk() и OnCancel(),&lt;br /&gt;
которые соответственно вызываются для этих команд. При помощи&lt;br /&gt;
визарда эти функции добавить можно так: Положить на диалог две кнопки&lt;br /&gt;
с идентификаторами IDOK и IDCANCEL (при создании нового диалога они там&lt;br /&gt;
есть сразу), затем двойной клик по кнопке добавляет соответствующий&lt;br /&gt;
обработчик. В обработчиках надо удалить вызовы СDialog::OnOK() и&lt;br /&gt;
CDialog::OnCancel(), тогда диалог закрываться не будет.&lt;br /&gt;
Однако тогда диалог станет невозможно закрыть кнопкой с крестиком  :)&lt;br /&gt;
&lt;br /&gt;
Лечить так: добавить обработчик сообщения WM_CLOSE - OnClose(), и в нём&lt;br /&gt;
сделать вызов OnOk() или OnCancel() :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void CPlayersPropsDialog::OnClose() &lt;br /&gt;
{&lt;br /&gt;
	CDialog::OnClose();&lt;br /&gt;
	CDialog::OnCancel();//добавлено&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===VC++6. Я написал простейший макрос, а компилятор на него ругается. Ума не приложу, что за глюк?===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	#define my_macr(x,y,z) \&lt;br /&gt;
		z=\&lt;br /&gt;
		(x+y)*\&lt;br /&gt;
		(x-y)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Скорее всего после одного из символов соединения строк &amp;quot;\&amp;quot; имеется&lt;br /&gt;
пробел или табуляция. Их надо удалить. Можно найти их &amp;quot;наощупь&amp;quot;, а&lt;br /&gt;
можно включить показ непечатных символов в студии. Найти эту команду&lt;br /&gt;
можно так:&lt;br /&gt;
Tools-&amp;gt;Customize...-&amp;gt;вкладка Commands. В окошке Category выбрать&lt;br /&gt;
&amp;quot;Edit&amp;quot;, и среди кнопок справа найти кнопку, на которой написано &amp;quot;a.b&amp;quot;&lt;br /&gt;
Эту кнопку надо перетащить на одну из панелей инструментов студии.&lt;br /&gt;
&lt;br /&gt;
===Как получить список всех процесов, включая idle?===&lt;br /&gt;
Использовать функции&lt;br /&gt;
Process32First()&lt;br /&gt;
Precess32Next()&lt;br /&gt;
&lt;br /&gt;
===Как программно установить переменные окружения?===&lt;br /&gt;
Чтобы добавить или изменить их программно, необходимо воспользоваться&lt;br /&gt;
ключом реестра HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\&lt;br /&gt;
Session Manager\Environment, а затем отправить широковещательное&lt;br /&gt;
сообщение WM_SETTINGCHANGE. Это позволит приложениям узнать об&lt;br /&gt;
изменениях:&lt;br /&gt;
&lt;br /&gt;
::SendMessage(HWND_BROADCAST,WM_SETTINGCHANGE,0,0);&lt;br /&gt;
===Как сделать, чтобы у окна был черный фон?===&lt;br /&gt;
переопределить обработчик сообщения WM_CTLCOLOR - OnCtlColor() :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CBrush br(RGB(0,0,0));&lt;br /&gt;
	&lt;br /&gt;
HBRUSH CMyDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) &lt;br /&gt;
{&lt;br /&gt;
	HBRUSH hbr = CMyDlg::OnCtlColor(pDC, pWnd, nCtlColor);&lt;br /&gt;
	&lt;br /&gt;
	//фон диалога (или вьюшки)&lt;br /&gt;
	if(nCtlColor==CTLCOLOR_DLG)&lt;br /&gt;
	{&lt;br /&gt;
		return (HBRUSH)br;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	//фон статиков (если нужно)&lt;br /&gt;
	if(nCtlColor==CTLCOLOR_STATIC)&lt;br /&gt;
	{&lt;br /&gt;
		//делаем фон текста статика прозрачным&lt;br /&gt;
		pDC-&amp;gt;SetBkMode(TRANSPARENT);&lt;br /&gt;
		return (HBRUSH)br;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	return hbr;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Почему на моем компьютере экзешник, созданный в MFC запускается, а на других компьютерах - нет? Требует какую-то  dll-ку.===&lt;br /&gt;
Нужно выбирать режим Release :&lt;br /&gt;
&lt;br /&gt;
Menu-&amp;gt;Build-&amp;gt;Configurations...-&amp;gt;Release,&lt;br /&gt;
&lt;br /&gt;
и экзешник, соответственно, брать из папки Release проекта&lt;br /&gt;
===Как в диалог добавить меню?===&lt;br /&gt;
Надо сделать в ресурсах меню, затем вставить в диалог:&lt;br /&gt;
&lt;br /&gt;
открыть в редакторе диалог, в свойствах (во вкладке General, окошко Menu) указать идентивикатор ресурса меню.&lt;br /&gt;
При помощи визарда добавить для меню обработчики OnCommand() и OnUpdateСommand().&lt;br /&gt;
===Я добавил визардом меню в диалог. Добавил обработчики для пунктов меню. Пункты работают, но OnUpdate для пунктов не вызывается - то есть не получается ни затенить, ни чек поставить. Что делать?===&lt;br /&gt;
В диалоге у меню апдейта не происходит сам, в отличие от мейнфрейма.&lt;br /&gt;
Для этого нужно сделать самим апдейт в обработчике сообщения WM_KICKIDLE.&lt;br /&gt;
Визардом обработчик не добавляется, поэтому можно переопределить виртуальную DefWindowProc() и там обработать:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;afxpriv.h&amp;gt;	//этот файл надо включить, там определёна WM_KICKIDLE&lt;br /&gt;
&lt;br /&gt;
LRESULT CMyDialog::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam) &lt;br /&gt;
{&lt;br /&gt;
	if(message==WM_KICKIDLE)&lt;br /&gt;
	{&lt;br /&gt;
		//делаем апдейт для всех пунктов меню&lt;br /&gt;
		CMenu* pMainMenu=GetMenu();&lt;br /&gt;
		if(pMainMenu)&lt;br /&gt;
		{&lt;br /&gt;
			CCmdUI cmdUI;&lt;br /&gt;
			for (UINT n=0; n &amp;lt; pMainMenu-&amp;gt;GetMenuItemCount(); ++n)&lt;br /&gt;
			{&lt;br /&gt;
				CMenu* pSubMenu = pMainMenu-&amp;gt;GetSubMenu(n);&lt;br /&gt;
				if(!pSubMenu)continue;&lt;br /&gt;
	&lt;br /&gt;
				cmdUI.m_nIndexMax = pSubMenu-&amp;gt;GetMenuItemCount();&lt;br /&gt;
				for (UINT i = 0; i &amp;lt; cmdUI.m_nIndexMax;++i)&lt;br /&gt;
				{&lt;br /&gt;
					cmdUI.m_nIndex = i;&lt;br /&gt;
					cmdUI.m_nID = pSubMenu-&amp;gt;GetMenuItemID(i);&lt;br /&gt;
					cmdUI.m_pMenu = pSubMenu;&lt;br /&gt;
					cmdUI.DoUpdate(this, FALSE);&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	return CDialog::DefWindowProc(message, wParam, lParam);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Как на Visual C++ 6.0 в Главном окне отключить системное меню (в левом верхнем углу) и кнопки(в правом верхнем углу)?===&lt;br /&gt;
При создании окна нужно убрать стиль WS_SYSMENU&lt;br /&gt;
(теперь пользователь корректно может закрыть окно только Alt+F4,&lt;br /&gt;
ну или если вы предоставите ему дополнительную возможность сделать это)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пример 1. (для SDI, MDI)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//этот обработчик уже добавлен визардом&lt;br /&gt;
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT&amp;amp; cs)&lt;br /&gt;
{&lt;br /&gt;
	if( !CFrameWnd::PreCreateWindow(cs) )&lt;br /&gt;
		return FALSE;&lt;br /&gt;
	// TODO: Modify the Window class or styles here by modifying&lt;br /&gt;
	//  the CREATESTRUCT cs&lt;br /&gt;
&lt;br /&gt;
	///////////////////////////////&lt;br /&gt;
	//добавленная часть&lt;br /&gt;
	{&lt;br /&gt;
		//убираем стиль&lt;br /&gt;
		cs.style&amp;amp;=~WS_SYSMENU;&lt;br /&gt;
	}&lt;br /&gt;
	///////////////////////////////&lt;br /&gt;
&lt;br /&gt;
	return TRUE;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Пример 2. (для диалога)&lt;br /&gt;
Если диалог описан в ресурсах, то в свойствах диалога убрать галочки&lt;br /&gt;
  &amp;quot;System menu&amp;quot;&lt;br /&gt;
  &amp;quot;Minimize box&amp;quot;&lt;br /&gt;
  &amp;quot;Maximize box&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===Хочу сделать так, чтобы пользователь не мог нажать на кнопку, пока программа не разрешит.===&lt;br /&gt;
Нужно применить метод класса CWnd::EnableWindow(...) для кнопки.&lt;br /&gt;
Значение параметра 0 делает кнопку неактивной, 1 - делает активной.&lt;br /&gt;
(кстате, не только для кнопки можно, а для любого класса, производного&lt;br /&gt;
от класса CWnd)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пусть имеется некий диалог, на нём лежит кнопка c ID == IDC_1.&lt;br /&gt;
в любом месте кода диалога (кроме конструктора и деструктора , хотя, если&lt;br /&gt;
проверить наличие валидного хендла диалога, как в примере, то ничего&lt;br /&gt;
страшного не будет и там)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//делаем кнопку неактивной&lt;br /&gt;
if(m_hWnd)&lt;br /&gt;
{&lt;br /&gt;
	CWnd* pw=0;&lt;br /&gt;
	pw=GetDlgItem(IDC_1);&lt;br /&gt;
	if(pw)pw-&amp;gt;EnableWindow(0);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Что означают сообщения, которые студия выводит при компиляции, вроде таких : Loaded 'C:\WINDOWS\SYSTEM\WSOCK32.DLL', no matching symbolic information found. ===&lt;br /&gt;
Это строка говорит о том, что студия не смогла найти отладочные&lt;br /&gt;
символы для WSOCK32.DLL. В этом нет ничего страшного, просто при наличии&lt;br /&gt;
отладочных символов в процессе отладки можно получить доступ к именам&lt;br /&gt;
функции из системных DLL. Например, вместо&lt;br /&gt;
 KERNEL32! 0x77E8B184() -&lt;br /&gt;
 увидим&lt;br /&gt;
 KERNEL32!CreateThread.&lt;br /&gt;
===Как обработать сообщения, которое приходит к некому контролу (скажем CEdit)?===&lt;br /&gt;
Нужно произвести от CEdit свой класс, и в виртуальной процедуре класса WindowProc перехватить нужные сообщения.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
virtual LRESULT WindowProc(&lt;br /&gt;
   UINT message,&lt;br /&gt;
   WPARAM wParam,&lt;br /&gt;
   LPARAM lParam &lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Пример. Полностью выключаем, скажем, обработку сообщения WM_CHAR&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	LRESULT CMyEdit::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) &lt;br /&gt;
	{&lt;br /&gt;
		switch(message)&lt;br /&gt;
		{&lt;br /&gt;
			case WM_CHAR:&lt;br /&gt;
			{&lt;br /&gt;
				return 0;&lt;br /&gt;
			}&lt;br /&gt;
			break;&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		return CEdit::WindowProc(message, wParam, lParam);&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Чтобы связать экземпляр класса с контролом на форме, добавьте визардом для&lt;br /&gt;
контрола переменную класса (выбрав не Value а Control).&lt;br /&gt;
&lt;br /&gt;
===Как настроить количество пробелов в табуляции?===&lt;br /&gt;
Tools-&amp;gt;Options-&amp;gt;Tabs-&amp;gt;Insert Spaces&lt;br /&gt;
(или  правой кнопкой мыши по тексту-&amp;gt; properties)&lt;br /&gt;
===Как автоматически расставить отступы?===&lt;br /&gt;
Выделить текст для форматирования, нажать Alt+F8&lt;br /&gt;
&lt;br /&gt;
Есть ещё программа Artistic Style, которая занимается&lt;br /&gt;
переформатированием кода&lt;br /&gt;
http://sourceforge.net/projects/astyle/&lt;br /&gt;
===Поиск границ блока===&lt;br /&gt;
&amp;quot;CTRL+ }&amp;quot; ищет парную фигурную скобку в тексте и переходит на неё&lt;br /&gt;
===Вертикальное выделение текста===&lt;br /&gt;
&amp;quot;Alt + выделение мышкой&amp;quot; - позволяет выделять вертикальные фрагменты текста&lt;br /&gt;
===Как узнать количество установленных в CListCtrl столбцов?===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CListCtrl* pL=...; //указатель на переменную-контрол&lt;br /&gt;
&lt;br /&gt;
int count=pL-&amp;gt;GetHeaderCtrl()-&amp;gt;GetItemCount();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Как получить иконку приложения?===&lt;br /&gt;
Если приложение запущено, то нужно найти его главное окно и&lt;br /&gt;
послать ему сообщение WM_GETICON.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//функция возвращант хендл иконки &lt;br /&gt;
LRESULT SendMessage(hWnd, WM_GETICON, wParam, 0);&lt;br /&gt;
&lt;br /&gt;
//hWnd == хендл окна приложения&lt;br /&gt;
//wParam == &lt;br /&gt;
//	1)==ICON_BIG - получить большую иконку&lt;br /&gt;
//	2)==ICON_SMALL - получить маленькую иконку&lt;br /&gt;
//	3)==ICON_SMALL2 - получить маленькую иконку, если она определена&lt;br /&gt;
//				в приложении. Если её нет, то маленькую иконку, &lt;br /&gt;
//				сгенерированную системой из большой иконки&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как в CString можно найти или вырезать часть строки?===&lt;br /&gt;
есть такие методы в CString :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//вырезает кусок строки&lt;br /&gt;
CString Mid(int nFirst) const;&lt;br /&gt;
CString Mid(int nFirst,  int nCount) const;&lt;br /&gt;
&lt;br /&gt;
//возвращает кусок строки (сначала или с конца)&lt;br /&gt;
CString Left(int nCount ) const;&lt;br /&gt;
CString Right(int nCount ) const;&lt;br /&gt;
&lt;br /&gt;
//возвращает начальный кусок строки, в котором есть только&lt;br /&gt;
//символы из набора,представленного в lpszCharSet&lt;br /&gt;
CString SpanIncluding(LPCTSTR lpszCharSet ) const;&lt;br /&gt;
&lt;br /&gt;
//возвращает начальный кусок строки, в котором нет&lt;br /&gt;
//символов из набора,представленного в lpszCharSet&lt;br /&gt;
CString SpanExcluding(LPCTSTR lpszCharSet ) const; &lt;br /&gt;
&lt;br /&gt;
//убирает &amp;quot;пробелоподобные&amp;quot; символы из самого начала строки&lt;br /&gt;
//(то есть - пробел, табуляцию (\t) , возврат каретки, перевод строки (/r/n))&lt;br /&gt;
void TrimLeft();&lt;br /&gt;
//убирает все повторы символа из самого начала строки&lt;br /&gt;
void TrimLeft(TCHAR chTarget );&lt;br /&gt;
//убирает из самого начала строки все символа из набора lpszTargets &lt;br /&gt;
void TrimLeft(LPCTSTR lpszTargets ); &lt;br /&gt;
&lt;br /&gt;
void TrimRight();&lt;br /&gt;
void TrimRight(TCHAR chTarget );&lt;br /&gt;
void TrimRight(LPCTSTR lpszTargets ); &lt;br /&gt;
&lt;br /&gt;
//поиск в строке&lt;br /&gt;
int Find( TCHAR ch ) const;&lt;br /&gt;
int Find( LPCTSTR lpszSub ) const;&lt;br /&gt;
int Find( TCHAR ch, int nStart ) const;&lt;br /&gt;
int Find( LPCTSTR pstr, int nStart ) const;&lt;br /&gt;
&lt;br /&gt;
//поиск, начиная с конца&lt;br /&gt;
int ReverseFind( TCHAR ch ) const;&lt;br /&gt;
&lt;br /&gt;
//поиск позиции первого символа, одного из набора,&lt;br /&gt;
// представленного в lpszCharSet&lt;br /&gt;
int FindOneOf( LPCTSTR lpszCharSet ) const;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Есть у меня CListBox и я в ходе выполнения программы добавляю в него строки. Но я не могу посмотреть что именно добавляется. Вывод результатов происходит в конце выполнения процедуры...===&lt;br /&gt;
Если нужно делать принудительную перерисовку окна во время&lt;br /&gt;
длительных вычислений, то нужно вызывать для окна, которое&lt;br /&gt;
надо перерисовать метод&lt;br /&gt;
  RedrawWindow()&lt;br /&gt;
с параметрами по умолчанию, или пару&lt;br /&gt;
  Invalidate(0);&lt;br /&gt;
  UpdateWindow();&lt;br /&gt;
Это приводит к пометке всего окна к перерисовке и отправлению&lt;br /&gt;
сообщения WM_PAINT в оконную процедуру в обход очереди&lt;br /&gt;
сообщений, вызывая немедленную перерисовку окна.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CWnd* pw=...;//окно , которое надо перерисовывать&lt;br /&gt;
&lt;br /&gt;
for(int i=0;i&amp;lt;10000)&lt;br /&gt;
{&lt;br /&gt;
	//меняется содержимое окна&lt;br /&gt;
	//...&lt;br /&gt;
&lt;br /&gt;
	//немедленная перерисовка&lt;br /&gt;
	pw-&amp;gt;Invalidate(0);&lt;br /&gt;
	pw-&amp;gt;UpdateWindow();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Я написал DLL , которую используют несколько приложений. Всё вроде работает, но когда происходит очередной вызов функции из DLL , почему то данные в функции обнуляются. С чем это связано ?===&lt;br /&gt;
Переменные и массивы в DLL, содержимое которых должно использоваться несколькими процессами, должны объявляться статическими. Статическая переменная или массив инициализируются только один раз в момент загрузки DLL.&lt;br /&gt;
Пример:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DWORD calltest()&lt;br /&gt;
{&lt;br /&gt;
	//будет выполнено только при первом вызове&lt;br /&gt;
	static DWORD callcount=0;&lt;br /&gt;
	static DWORD str[1000]={0}; &lt;br /&gt;
&lt;br /&gt;
	//будет выполняться каждый раз&lt;br /&gt;
	return ++callcount;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как открыть проекцию файла в память и как с ней работать?===&lt;br /&gt;
Как открыть проекцию файла в память и как с ней работать?&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HANDLE CreateFileMapping(&lt;br /&gt;
  HANDLE hFile,	//хендл уже открытого файла&lt;br /&gt;
  LPSECURITY_ATTRIBUTES lpAttributes,&lt;br /&gt;
  DWORD flProtect,	//способ открытия проекции&lt;br /&gt;
  DWORD dwMaximumSizeHigh,	//размер файла (старшие 4 байта , обычно==0)&lt;br /&gt;
  DWORD dwMaximumSizeLow,	//размер файла (младшие 4 байта)&lt;br /&gt;
  LPCTSTR lpName&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Доступ к созданной проекции производится процедурой&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LPVOID MapViewOfFile(&lt;br /&gt;
  HANDLE hFileMappingObject, //хендл проекции&lt;br /&gt;
  DWORD dwDesiredAccess,	//способ работы с проекцией&lt;br /&gt;
  DWORD dwFileOffsetHigh,&lt;br /&gt;
  DWORD dwFileOffsetLow, //смещение от начала файла (младшие 4 байта)&lt;br /&gt;
  SIZE_T dwNumberOfBytesToMap //длина в байтах (если ==0 - то весь файл)&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
далее с файлом можно работать как с обычным массивом в памяти.&lt;br /&gt;
&lt;br /&gt;
После работы с проекцией , её надо освободить процедурой&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
BOOL UnmapViewOfFile(&lt;br /&gt;
  LPCVOID lpBaseAddress //адрес, который вернула процедура MapViewOfFile&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Пример.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HANDLE hMapFile=0;//для проекции&lt;br /&gt;
&lt;br /&gt;
HANDLE hFile=...;//хендл уже открытого файла&lt;br /&gt;
DWORD dwdFileLen=...;//размер открытого файла&lt;br /&gt;
&lt;br /&gt;
//создаём проекцию &amp;quot;только для чтения&amp;quot;&lt;br /&gt;
hMapFile=::CreateFileMapping(hFile,0,PAGE_READONLY,0,dwdFileLen,0);&lt;br /&gt;
&lt;br /&gt;
//хендл hFile можно закрыть уже здесь, в принципе,&lt;br /&gt;
//но мы сделаем это позже&lt;br /&gt;
&lt;br /&gt;
//получаем доступ к проекции (тоже только для чтения)&lt;br /&gt;
BYTE* pbyFile=(BYTE*)::MapViewOfFile(hMapFile,FILE_MAP_READ,0,0,0);&lt;br /&gt;
&lt;br /&gt;
///////////////////&lt;br /&gt;
//тут работаем с массивом pbyFile[dwdFileLen] как с обычным,&lt;br /&gt;
//только не забываем, что он открыт только для чтения&lt;br /&gt;
//...&lt;br /&gt;
//...&lt;br /&gt;
//...&lt;br /&gt;
///////////////////&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//отключаем файл данных от адресного пространства&lt;br /&gt;
UnmapViewOfFile(pbyFile);&lt;br /&gt;
&lt;br /&gt;
//освобождаем хендл проекции&lt;br /&gt;
CloseHandle(hMapFile)&lt;br /&gt;
&lt;br /&gt;
//освобождаем хендл открытого файла&lt;br /&gt;
CloseHandle(hFile);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Использую MFC Grid control 2.25 , не получается отобразить картинку в ячейке. Как это делается ?===&lt;br /&gt;
Нужно создать список изображений (CImageList) , затем передать указатель на список в контрол. Поскольку контрол лишь копирует указатель , список должен создаваться динамически, либо быть членом класса, экземпляр которого существует всё время работы контрола.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 m_GridMarket&lt;br /&gt;
CImageList m_ImageList;&lt;br /&gt;
CGridCtrL m_Grid1&lt;br /&gt;
...&lt;br /&gt;
...&lt;br /&gt;
//неким образом создаётся список&lt;br /&gt;
m_ImageList.Create(...);&lt;br /&gt;
//...&lt;br /&gt;
&lt;br /&gt;
//вставляем в контрол&lt;br /&gt;
m_Grid1.SetImageList(&amp;amp;m_ImageList);&lt;br /&gt;
&lt;br /&gt;
//&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как при помощи IPicture отобразить картинку из файла? ===&lt;br /&gt;
Пример - несложная функция, отображающая картинку из файла&lt;br /&gt;
&lt;br /&gt;
поддерживаются форматы&lt;br /&gt;
BMP, GIF, JPEG, PNG, TIFF, EMF&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;quot;atlconv.h&amp;quot;&lt;br /&gt;
#define HandleIsValid(H) (H!=(HANDLE)-1 &amp;amp;&amp;amp; H!=(HANDLE)0)&lt;br /&gt;
&lt;br /&gt;
//*pDestDC - CDC, на который предполагается вывод картинки&lt;br /&gt;
//pchzFilePath - путь к файлу&lt;br /&gt;
//pWid - (возвращает) ширина картинки&lt;br /&gt;
//pHig - (возвращает) высота картинки&lt;br /&gt;
bool DrawBitmapFromFile(CDC* pDestDC,const char* pchzFilePath,int *pWid=0,int *pHig=0)&lt;br /&gt;
{&lt;br /&gt;
	bool result=false;&lt;br /&gt;
&lt;br /&gt;
	if(pWid)*pWid=0;&lt;br /&gt;
	if(pHig)*pHig=0;&lt;br /&gt;
&lt;br /&gt;
	int Wid=0;&lt;br /&gt;
	int Hig=0;&lt;br /&gt;
&lt;br /&gt;
	IPicture* pPic=0;&lt;br /&gt;
	try&lt;br /&gt;
	{&lt;br /&gt;
		IPicture* ptmpPic=0;&lt;br /&gt;
		USES_CONVERSION;&lt;br /&gt;
		HRESULT hr;&lt;br /&gt;
&lt;br /&gt;
		CString txt=pchzFilePath;&lt;br /&gt;
		hr= ::OleLoadPicturePath(&lt;br /&gt;
			const_cast&amp;lt;LPOLESTR&amp;gt;(T2COLE(txt)),&lt;br /&gt;
			0,0,0,IID_IPicture,&lt;br /&gt;
			reinterpret_cast&amp;lt;void **&amp;gt;(&amp;amp;ptmpPic)&lt;br /&gt;
			);&lt;br /&gt;
&lt;br /&gt;
		if(hr==S_OK &amp;amp;&amp;amp; ptmpPic)&lt;br /&gt;
		{&lt;br /&gt;
			pPic=ptmpPic;&lt;br /&gt;
		}&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			throw 0;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		OLE_XPOS_HIMETRIC cxSrc;&lt;br /&gt;
		OLE_YPOS_HIMETRIC cySrc;&lt;br /&gt;
&lt;br /&gt;
		if(S_OK!=pPic-&amp;gt;get_Width(&amp;amp;cxSrc))throw 0;&lt;br /&gt;
		if(S_OK!=pPic-&amp;gt;get_Height(&amp;amp;cySrc))throw 0;&lt;br /&gt;
&lt;br /&gt;
		Wid=cxSrc/26;&lt;br /&gt;
		Hig=cySrc/26;&lt;br /&gt;
&lt;br /&gt;
		//рисуем&lt;br /&gt;
		if(S_OK !=pPic-&amp;gt;Render(pDestDC-&amp;gt;GetSafeHdc(),&lt;br /&gt;
			0,Hig,Wid,-Hig,0,0,cxSrc,cySrc,0))throw 0;&lt;br /&gt;
	}&lt;br /&gt;
	catch(...)&lt;br /&gt;
	{&lt;br /&gt;
		result=false;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if(pPic)&lt;br /&gt;
	{&lt;br /&gt;
		pPic-&amp;gt;Release();&lt;br /&gt;
		pPic=0;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	if(pWid)*pWid=Wid;&lt;br /&gt;
	if(pHig)*pHig=Hig;&lt;br /&gt;
&lt;br /&gt;
	return result;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===У меня модальное диалоговое окно, в нем поле редактирования мультилайновое, т.е. чтобы перейти на новую строку надо нажать ентер, но вызывается стандартный обработчик диалогового окна. Подскажите, что делать?===&lt;br /&gt;
Нужно в редакторе ресурсов поставить для CEdit окошка галочку&lt;br /&gt;
свойства WantReturn,&lt;br /&gt;
&lt;br /&gt;
или добавить ES_WANTRETURN при создании CEdit контрола динамически.&lt;br /&gt;
===Как выводят картинку-логотип(splash screen) при запуске программы? То есть, когда загружается программа на экран выводится картинка, потом она исчезает(загрузка программы закончена) и пользователь может приступать к работе ===&lt;br /&gt;
Для этого используется класс, производный от CDialog. Этот диалог после создания показывает себя на экран, выводя на себя рисунок. Также запускает таймет, по срабатывани которого диалог гасится. Создаётся диалог InitInstance приложения.&lt;br /&gt;
&lt;br /&gt;
В VC6++ также есть уже готовый компонент&lt;br /&gt;
Project-&amp;gt;Add To Project -&amp;gt; Components and Controls-&amp;gt;(в папке &amp;quot;Visual C++ Components&amp;quot; есть SplashScreen.)&lt;br /&gt;
===Как сделать, чтобы при выпадении списка у ComboBox была не одна строка, а больше, вроде все свойства покрутил, не помогает Вместо выпадающего списка одна строка и скролл...===&lt;br /&gt;
В редакторе ресурсов надо щелкнуть в комбобоксе на треугольнике - появляется рамка для растягивания вниз - размер выпадающего списка.&lt;br /&gt;
===В VC++.net , что делать после того, как на форму установил ActiiveX ListView, как объявить класс и переменную для этого элемента?===&lt;br /&gt;
Щёлкнуть правой кнопкой мыши на элементе , в меню - add variable или add class&lt;br /&gt;
===Как вставить данные в буфер обмена (Clipboard) ? Как их оттуда вытащить ?===&lt;br /&gt;
&lt;br /&gt;
1) копирование в буфер обмена:&lt;br /&gt;
&lt;br /&gt;
  1.Готовим данные&lt;br /&gt;
    а.Выделяем память из кучи,  вызывая GlobalAlloc()&lt;br /&gt;
    б.Получаем указатель на выделенную память, вызывая GlobalLock()&lt;br /&gt;
    в.Заполняем данные&lt;br /&gt;
    г.Освобождаем указатель , вызывая GlobalUnlock();&lt;br /&gt;
&lt;br /&gt;
  2.Открываем буфер обмена , вызывая OpenClipboard();&lt;br /&gt;
  3.Очищаем буфер, вызывая EmptyClipboard();&lt;br /&gt;
  4.Вызываем SetClipboardData() один раз для каждого формата&lt;br /&gt;
      вставляемых данных (имеется в виду - если одни и те же&lt;br /&gt;
      данные представлены в разных форматах, и приложение&lt;br /&gt;
      может эти форматы создать)&lt;br /&gt;
  5.Закрываем буфер, вызывая CloseClipboard();&lt;br /&gt;
  6.ВЫЗЫВАТЬ GlobalFree() НЕ НУЖНО , в этом случае это&lt;br /&gt;
      предоставлено системе&lt;br /&gt;
&lt;br /&gt;
Скажем, хотим поместить в буфер обмена туда текст.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	//готовим данные&lt;br /&gt;
	//выделяем из кучи память для данных&lt;br /&gt;
	HANDLE hglbCopy = GlobalAlloc(GMEM_MOVEABLE,10);&lt;br /&gt;
	if(!hglbCopy)return;&lt;br /&gt;
&lt;br /&gt;
	//получаем указатель&lt;br /&gt;
	void* lpStr = GlobalLock(hglbCopy);&lt;br /&gt;
	if(!lpStr)return;&lt;br /&gt;
&lt;br /&gt;
	//заполняем данные&lt;br /&gt;
	strcpy((char*)lpStr,&amp;quot;my text&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	//освобождаем указатель&lt;br /&gt;
	GlobalUnlock(hglbCopy);&lt;br /&gt;
	lpStr=0;&lt;br /&gt;
&lt;br /&gt;
	//открываем буфер обмена&lt;br /&gt;
	OpenClipboard();&lt;br /&gt;
	//очищаем&lt;br /&gt;
	EmptyClipboard();&lt;br /&gt;
&lt;br /&gt;
	//текстовый формат&lt;br /&gt;
	SetClipboardData(CF_TEXT,hglbCopy);&lt;br /&gt;
&lt;br /&gt;
	//закрываем буфер&lt;br /&gt;
	CloseClipboard();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
2) извлечение из буфера обмена&lt;br /&gt;
&lt;br /&gt;
  1.Проверяем, что поддерживается нужный формат данных,&lt;br /&gt;
      вызывая IsClipboardFormatAvailable()&lt;br /&gt;
  2.Открываем буфер обмена , вызывая OpenClipboard();&lt;br /&gt;
  3.Достаём данные&lt;br /&gt;
   а.Получаем из буфера хендл требуемого формата,&lt;br /&gt;
      вызывая GetClipboardData()&lt;br /&gt;
    б.Получаем указатель на выделенную память, вызывая GlobalLock()&lt;br /&gt;
    в.Работаем с данными&lt;br /&gt;
    г.Освобождаем указатель , вызывая GlobalUnlock();&lt;br /&gt;
  4.Закрываем буфер, вызывая CloseClipboard();&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	//Проверяем, что поддерживается нужный формат данных,&lt;br /&gt;
	if(!IsClipboardFormatAvailable(CF_TEXT))return;&lt;br /&gt;
&lt;br /&gt;
	//открываем буфер обмена&lt;br /&gt;
	OpenClipboard();&lt;br /&gt;
&lt;br /&gt;
	//достаём данные&lt;br /&gt;
&lt;br /&gt;
	//текстовый формат&lt;br /&gt;
	HANDLE hglbCopy = GetClipboardData(CF_TEXT);&lt;br /&gt;
	if(!hglbCopy)return;&lt;br /&gt;
&lt;br /&gt;
	//получаем указатель&lt;br /&gt;
	void* lpStr = GlobalLock(hglbCopy);&lt;br /&gt;
	if(!lpStr)return;&lt;br /&gt;
&lt;br /&gt;
	//читаем данные&lt;br /&gt;
	char data[10];&lt;br /&gt;
	memmove(data,lpStr,sizeof(data));&lt;br /&gt;
&lt;br /&gt;
	//освобождаем указатель&lt;br /&gt;
	GlobalUnlock(hglbCopy);&lt;br /&gt;
	lpStr=0;&lt;br /&gt;
&lt;br /&gt;
	//закрываем буфер&lt;br /&gt;
	CloseClipboard();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как получить полный путь к экзешнику из самой программы ?===&lt;br /&gt;
В командную строку первым параметром система всегда передаёт заключённый в кавычки полный путь к файлу запущенной программы Достаём путь таким образом :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
BOOL CMyApp::InitInstance()&lt;br /&gt;
{&lt;br /&gt;
	//добыча полного имени экзешника&lt;br /&gt;
	CString csFullExeName;&lt;br /&gt;
	{&lt;br /&gt;
		CString csAppName=GetCommandLine();&lt;br /&gt;
		csAppName.Delete(0,1);&lt;br /&gt;
		csAppName.Replace('\&amp;quot;','\0');&lt;br /&gt;
		csFullExeName=(const char*)csAppName;&lt;br /&gt;
	}&lt;br /&gt;
	//теперь csFullExeName - содержит искомый путь&lt;br /&gt;
&lt;br /&gt;
	//...&lt;br /&gt;
	//...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Каким способом можно exe файл может заменить самого себя? То есть, моя программа обновляется, например, через Internet, и хочет обновить свой exe-файл. Но так как он в данный момент запущен - это будет, естественно, запрещено. Как это можно проще всего сделать?===&lt;br /&gt;
Один из способов - сделать копию экзешника и из него обновиться&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define def_exeNAMEup	&amp;quot;c:\\myprog_update.exe&amp;quot;&lt;br /&gt;
#define def_exeNAMEdnld	&amp;quot;c:\\myprog_downloaded.exe&amp;quot;&lt;br /&gt;
#define def_keyUdate	&amp;quot;/update&amp;quot;&lt;br /&gt;
&lt;br /&gt;
void CTESTFAQApp::UpdateItself()&lt;br /&gt;
{&lt;br /&gt;
	//добыча полного имени экзешника&lt;br /&gt;
	CString csFullExeName;&lt;br /&gt;
	{&lt;br /&gt;
		CString csAppName=GetCommandLine();&lt;br /&gt;
		csAppName.Delete(0,1);&lt;br /&gt;
		csAppName.Replace('\&amp;quot;','\0');&lt;br /&gt;
		csFullExeName=(const char*)csAppName;&lt;br /&gt;
	}&lt;br /&gt;
	//теперь csFullExeName - содержит искомый путь&lt;br /&gt;
&lt;br /&gt;
	//делаем копию экзешника с другим именем&lt;br /&gt;
	CopyFile(csFullExeName,def_exeNAMEup,0);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	//передаём в параметры нового процесса ключ и путь к текущему файлу&lt;br /&gt;
	CString csParams=def_keyUdate;&lt;br /&gt;
	csParams+=&amp;quot; &amp;quot;;&lt;br /&gt;
	csParams+=csFullExeName;&lt;br /&gt;
&lt;br /&gt;
	//запускаем копию&lt;br /&gt;
	STARTUPINFO si;&lt;br /&gt;
	PROCESS_INFORMATION pi;&lt;br /&gt;
	ZeroMemory(&amp;amp;si,sizeof(si));&lt;br /&gt;
	si.cb = sizeof(si);&lt;br /&gt;
	ZeroMemory(&amp;amp;pi,sizeof(pi));&lt;br /&gt;
	if(CreateProcess(def_exeNAMEup,def_keyUdate,0,0,0,0,0,0,&amp;amp;si,&amp;amp;pi))&lt;br /&gt;
	{&lt;br /&gt;
		//завершаем текущий процесс&lt;br /&gt;
		ExitFromMyApp();&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void CTESTFAQApp::ExitFromMyApp()&lt;br /&gt;
{&lt;br /&gt;
	exit(0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
BOOL CTESTFAQApp::InitInstance()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
	//смотрим, не запустили ли для апдейта?&lt;br /&gt;
&lt;br /&gt;
	CString txt;&lt;br /&gt;
	txt=m_lpCmdLine;&lt;br /&gt;
	if(txt.Find(def_keyUdate)==0)&lt;br /&gt;
	{&lt;br /&gt;
		//делаем айдейт&lt;br /&gt;
		txt.Replace(def_keyUdate,&amp;quot;&amp;quot;);&lt;br /&gt;
		txt.TrimLeft();&lt;br /&gt;
&lt;br /&gt;
		CString csFullExeName=txt;&lt;br /&gt;
&lt;br /&gt;
		//берём откуда то уже скачанный файл обновления&lt;br /&gt;
		//...&lt;br /&gt;
		CString csFull_Downloaded_ExeName=def_exeNAMEdnld;&lt;br /&gt;
&lt;br /&gt;
		//копируем файл (обновляем старый то есть)&lt;br /&gt;
		CopyFile(csFull_Downloaded_ExeName,csFullExeName,0);&lt;br /&gt;
&lt;br /&gt;
		//запускаем обновлённого мученника&lt;br /&gt;
		STARTUPINFO si;&lt;br /&gt;
		PROCESS_INFORMATION pi;&lt;br /&gt;
		ZeroMemory(&amp;amp;si,sizeof(si));&lt;br /&gt;
		si.cb = sizeof(si);&lt;br /&gt;
		ZeroMemory(&amp;amp;pi,sizeof(pi));&lt;br /&gt;
		if(CreateProcess(csFullExeName,0,0,0,0,0,0,0,&amp;amp;si,&amp;amp;pi))&lt;br /&gt;
&lt;br /&gt;
		ExitFromMyApp();&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
	//...&lt;br /&gt;
	//...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Есть строка символов (страничка из Инета) в кодировке utf-8 (строка char*). Как мне ее получить в формате String&lt;br /&gt;
или в char* в кодировке ANSI (cp 1251) ?===&lt;br /&gt;
Можно перевести строку из UTF8 в Unicode, затем из Unicode в 1251&lt;br /&gt;
&lt;br /&gt;
Ниже приведена структура, содержащая процедуры перекодирования,&lt;br /&gt;
а также процедуру с примером использования&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//описание структуры&lt;br /&gt;
struct coder&lt;br /&gt;
{&lt;br /&gt;
	//utf8-&amp;gt;unicode&lt;br /&gt;
	static wchar_t* utf8_to_unicode__dontForgetDeleteArr(const char *utf8_string)&lt;br /&gt;
	{&lt;br /&gt;
		wchar_t* pRes=0;&lt;br /&gt;
		int res_len=0;&lt;br /&gt;
&lt;br /&gt;
		//тест на возможность преобразования&lt;br /&gt;
		res_len=MultiByteToWideChar(CP_UTF8,0,utf8_string,-1,0,0);&lt;br /&gt;
		if(!res_len)return 0;&lt;br /&gt;
&lt;br /&gt;
		//выделяем память&lt;br /&gt;
		pRes = new wchar_t[res_len];&lt;br /&gt;
		if(!pRes)return 0;&lt;br /&gt;
&lt;br /&gt;
		//преобразование&lt;br /&gt;
		if(!MultiByteToWideChar(CP_UTF8,0,utf8_string,-1,pRes,res_len))&lt;br /&gt;
		{&lt;br /&gt;
			delete [] pRes;&lt;br /&gt;
			return 0;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		return pRes;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	//unicode-&amp;gt;1251&lt;br /&gt;
	static char * unicode_to_1251__dontForgetDeleteArr(const wchar_t *unicode_string)&lt;br /&gt;
	{&lt;br /&gt;
		char* pRes=0;&lt;br /&gt;
		int res_len=0;&lt;br /&gt;
&lt;br /&gt;
		//тест на возможность преобразования&lt;br /&gt;
		res_len = WideCharToMultiByte(1251,0,unicode_string,-1,0,0,0,0);&lt;br /&gt;
		if(!res_len)return 0;&lt;br /&gt;
&lt;br /&gt;
		//выделяем память&lt;br /&gt;
		pRes=new char[res_len];&lt;br /&gt;
		if(!pRes)return 0;&lt;br /&gt;
&lt;br /&gt;
		//преобразование&lt;br /&gt;
		if(!WideCharToMultiByte(1251,0,unicode_string,-1,pRes,res_len,0,0))&lt;br /&gt;
		{&lt;br /&gt;
			delete [] pRes;&lt;br /&gt;
			return 0;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		return pRes;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	//процедура с примером&lt;br /&gt;
	static void Example()&lt;br /&gt;
	{&lt;br /&gt;
		wchar_t* unicode_string=0;&lt;br /&gt;
		char* cp1251_string=0;&lt;br /&gt;
&lt;br /&gt;
		//исходный текст&lt;br /&gt;
		char utf8_string[] = &amp;quot;UTF-8 + СЂСѓСЃСЃРєРёР№ С‚РµРєСЃС‚&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
		for(;;)&lt;br /&gt;
		{&lt;br /&gt;
&lt;br /&gt;
			unicode_string=utf8_to_unicode__dontForgetDeleteArr(utf8_string);&lt;br /&gt;
			if(!unicode_string)&lt;br /&gt;
			{&lt;br /&gt;
				AfxMessageBox(&amp;quot;Не удалось конвертировать в unicode!&amp;quot;);&lt;br /&gt;
				break;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			cp1251_string = unicode_to_1251__dontForgetDeleteArr(unicode_string);&lt;br /&gt;
&lt;br /&gt;
			if(!cp1251_string)&lt;br /&gt;
			{&lt;br /&gt;
				AfxMessageBox(&amp;quot;Не удалось конвертировать из unicode!&amp;quot;);&lt;br /&gt;
				break;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			break;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		//cp1251_string - результат&lt;br /&gt;
		AfxMessageBox(cp1251_string);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
		//не забываем удалить массивы&lt;br /&gt;
		if(unicode_string)&lt;br /&gt;
		{&lt;br /&gt;
			delete [] unicode_string;&lt;br /&gt;
			unicode_string=0;&lt;br /&gt;
		}&lt;br /&gt;
		if(cp1251_string)&lt;br /&gt;
		{&lt;br /&gt;
			delete [] cp1251_string;&lt;br /&gt;
			cp1251_string=0;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
//вызов примера&lt;br /&gt;
coder::Example();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как организовать взаимодействие программы на VC.net с Access-овской базой данных?===&lt;br /&gt;
Проще всего подключить ADO компоненты и сделать все на них.&lt;br /&gt;
Компоненты  ADO (ADODC,DATAGRID и т.п.) это ActiveX.&lt;br /&gt;
В редакторе ресурсов, во всплывающем меню, есть Insert ActiveX Control -&amp;gt; открывается список всех компоент,&lt;br /&gt;
зарегистрированых на машине. Нужно найти компоненты (Это компоненты от MS и они помечены (OLEDB)) и вставить их в диалог. Для того что бы иметь возможность управлять ими, нужно импортировать обертки для них, это делается при помощи ClassWisard, там есть импорт-&amp;gt;класс-&amp;gt;указать файл с компоентой (OSX).&lt;br /&gt;
Появляется список всех классов, объявленых внутри.&lt;br /&gt;
Проставляем галочки, нажимаем ОК.&lt;br /&gt;
&lt;br /&gt;
[[Category:FAQ]]&lt;/div&gt;</summary>
		<author><name>Mczim</name></author>	</entry>

	<entry>
		<id>https://wiki.shelek.ru/index.php?title=FAQ:WinAPI,_VCPP_Part_3&amp;diff=413</id>
		<title>FAQ:WinAPI, VCPP Part 3</title>
		<link rel="alternate" type="text/html" href="https://wiki.shelek.ru/index.php?title=FAQ:WinAPI,_VCPP_Part_3&amp;diff=413"/>
				<updated>2008-08-14T18:49:03Z</updated>
		
		<summary type="html">&lt;p&gt;Mczim: /* Как обработать сообщения , которое приходит к некому контролу (скажем CEdit)? */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Имеется приложение на основе CRichEditView. Как узнать, что пользователь меняет текст?===&lt;br /&gt;
Добавить обработчик сообщения EN_CHANGE. Сообщение генерируется CRichEditView каждый раз, когда пользователь изменяет текст в окне CRichEditView&lt;br /&gt;
===Чем метод CArray::GetSize отличается от метода CArray::GetCount?===&lt;br /&gt;
Абсолютно ничем. (Скорее всего, были предыдущие библиотеки, в которых функции, одинаковые по смыслу, имели разные имена. Поэтому в целях совместимости оставили оба)&lt;br /&gt;
===Как загрузить строку из ресурса?===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CString m_Temp;&lt;br /&gt;
m_Temp.LoadString(ID_MYSTRING);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как поменять иконку у элемента (item) в CListCtrl?===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//заполняем структуру LVITEM&lt;br /&gt;
LVITEM lvItem;&lt;br /&gt;
memset(&amp;amp;lvItem,0,sizeof(lvItem));&lt;br /&gt;
	&lt;br /&gt;
lvItem.mask = LVIF_IMAGE;//меняться будет картинка&lt;br /&gt;
lvItem.iItem = ...;// индекс элемента списка (Zero-based)&lt;br /&gt;
lvItem.iSubItem = 0;&lt;br /&gt;
lvItem.iImage = ...; //индекс иконки (из списка контрола)&lt;br /&gt;
	&lt;br /&gt;
pList-&amp;gt;SetItem(&amp;amp; lvItem);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Имеется класс Class1, содержащий мембер типа указатель на Class2. В Class2 также имеется указатель на Class1. Компилятор выдаёт ошибку. Что надо делать?===&lt;br /&gt;
Предварительно объявляем класс Class2. Тогда компилятору будет известно, что описание класса Class2 будет встречено дальше, и станет возможным объявление указателей на класс до описания самого класса.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Class2;//предопределение&lt;br /&gt;
	&lt;br /&gt;
Class1&lt;br /&gt;
{&lt;br /&gt;
	Class2* p;&lt;br /&gt;
};&lt;br /&gt;
	&lt;br /&gt;
Class2&lt;br /&gt;
{&lt;br /&gt;
	Class1* p;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как переключить раскладку в другом (то есть в активном) процессе?===&lt;br /&gt;
Использовать функции:&lt;br /&gt;
   GetKeyboardLayout - определить текущую раскладку&lt;br /&gt;
   LoadKeyboardLayout - загрузить новую раскладку&lt;br /&gt;
&lt;br /&gt;
см.также&lt;br /&gt;
   VerLanguageName - получить строку с описанием языка&lt;br /&gt;
&lt;br /&gt;
(подробности - в MSDN)&lt;br /&gt;
===Как получить хендл контрола Edit зная его ID?===&lt;br /&gt;
Пусть контрол лежит на окне CMyWnd&lt;br /&gt;
Тогда:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void CMyWnd::некая_процедура()&lt;br /&gt;
{&lt;br /&gt;
	//для MFC&lt;br /&gt;
	CEdit* ed=(CEdit* ) GetDlgItem(ID_EDIT1);&lt;br /&gt;
	HWND hwnd=ed-&amp;gt;GetSafeHwnd();&lt;br /&gt;
	...&lt;br /&gt;
	&lt;br /&gt;
	//для Win32 API&lt;br /&gt;
	HWND hwnd=GetDlgItem(m_hWnd,ID_EDIT1);&lt;br /&gt;
	...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Как из дочернего окна закрыть приложение?===&lt;br /&gt;
Нужно послать родительскому окну (*pParent) сообщение WM_CLOSE:&lt;br /&gt;
 pParent-&amp;gt;PostMessage(WM_CLOSE);//MFC&lt;br /&gt;
или&lt;br /&gt;
 ::PostMessage(pParent-&amp;gt;m_hWnd,WM_CLOSE,(WPARAM)0,(LPARAM)0);//API&lt;br /&gt;
===Как корректно перевести BSTR в CString и наоборот?===&lt;br /&gt;
Нужно просто присвоить переменной типа CString переменную типа BSTR.&lt;br /&gt;
Оператор = класса CString сам всё переведёт.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//указатель на будущий буфер с BSTR.&lt;br /&gt;
//	(По сути, BSTR определён как &lt;br /&gt;
//	typedef WCHAR* BSTR;&lt;br /&gt;
//	то есть указатель на 16-битный символ юникод)&lt;br /&gt;
	&lt;br /&gt;
BSTR bstrHE=0;&lt;br /&gt;
	&lt;br /&gt;
CString Str=&amp;quot;мой текст&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
//Выделить память и загрузить адрес блока в bstrHE&lt;br /&gt;
bstrHE=Str.AllocSysString();&lt;br /&gt;
	&lt;br /&gt;
//...	&lt;br /&gt;
//тут работаем с bstrHE[]&lt;br /&gt;
//...&lt;br /&gt;
	&lt;br /&gt;
//освобождаем память&lt;br /&gt;
SysFreeString(bstrHE);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Как получить доступ к графическим ресурсам элементов текущей темы оформления Windows?===&lt;br /&gt;
Использовать функции&lt;br /&gt;
&lt;br /&gt;
OpenThemeData()&lt;br /&gt;
DrawThemeBackground()&lt;br /&gt;
DrawFrameControl()&lt;br /&gt;
CloseThemeData().&lt;br /&gt;
&lt;br /&gt;
(подробности - в MSDN)&lt;br /&gt;
===Имеется класс , производный от CDialog. Когда диалог в фокусе, нажатие на Enter или Esc приводит к закрытию диалога. Как это запретить?===&lt;br /&gt;
При нажатии Enter происходит выполнение команды IDOK,&lt;br /&gt;
при нажатии Esc - IDCANCEL.&lt;br /&gt;
Нужно переопределить в классе виртуальные функции OnOk() и OnCancel(),&lt;br /&gt;
которые соответственно вызываются для этих команд. При помощи&lt;br /&gt;
визарда эти функции добавить можно так: Положить на диалог две кнопки&lt;br /&gt;
с идентификаторами IDOK и IDCANCEL (при создании нового диалога они там&lt;br /&gt;
есть сразу), затем двойной клик по кнопке добавляет соответствующий&lt;br /&gt;
обработчик. В обработчиках надо удалить вызовы СDialog::OnOK() и&lt;br /&gt;
CDialog::OnCancel(), тогда диалог закрываться не будет.&lt;br /&gt;
Однако тогда диалог станет невозможно закрыть кнопкой с крестиком  :)&lt;br /&gt;
&lt;br /&gt;
Лечить так: добавить обработчик сообщения WM_CLOSE - OnClose(), и в нём&lt;br /&gt;
сделать вызов OnOk() или OnCancel() :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void CPlayersPropsDialog::OnClose() &lt;br /&gt;
{&lt;br /&gt;
	CDialog::OnClose();&lt;br /&gt;
	CDialog::OnCancel();//добавлено&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===VC++6. Я написал простейший макрос, а компилятор на него ругается. Ума не приложу, что за глюк?===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	#define my_macr(x,y,z) \&lt;br /&gt;
		z=\&lt;br /&gt;
		(x+y)*\&lt;br /&gt;
		(x-y)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Скорее всего после одного из символов соединения строк &amp;quot;\&amp;quot; имеется&lt;br /&gt;
пробел или табуляция. Их надо удалить. Можно найти их &amp;quot;наощупь&amp;quot;, а&lt;br /&gt;
можно включить показ непечатных символов в студии. Найти эту команду&lt;br /&gt;
можно так:&lt;br /&gt;
Tools-&amp;gt;Customize...-&amp;gt;вкладка Commands. В окошке Category выбрать&lt;br /&gt;
&amp;quot;Edit&amp;quot;, и среди кнопок справа найти кнопку, на которой написано &amp;quot;a.b&amp;quot;&lt;br /&gt;
Эту кнопку надо перетащить на одну из панелей инструментов студии.&lt;br /&gt;
&lt;br /&gt;
===Как получить список всех процесов, включая idle?===&lt;br /&gt;
Использовать функции&lt;br /&gt;
Process32First()&lt;br /&gt;
Precess32Next()&lt;br /&gt;
&lt;br /&gt;
===Как программно установить переменные окружения?===&lt;br /&gt;
Чтобы добавить или изменить их программно, необходимо воспользоваться&lt;br /&gt;
ключом реестра HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\&lt;br /&gt;
Session Manager\Environment, а затем отправить широковещательное&lt;br /&gt;
сообщение WM_SETTINGCHANGE. Это позволит приложениям узнать об&lt;br /&gt;
изменениях:&lt;br /&gt;
&lt;br /&gt;
::SendMessage(HWND_BROADCAST,WM_SETTINGCHANGE,0,0);&lt;br /&gt;
===Как сделать, чтобы у окна был черный фон?===&lt;br /&gt;
переопределить обработчик сообщения WM_CTLCOLOR - OnCtlColor() :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CBrush br(RGB(0,0,0));&lt;br /&gt;
	&lt;br /&gt;
HBRUSH CMyDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) &lt;br /&gt;
{&lt;br /&gt;
	HBRUSH hbr = CMyDlg::OnCtlColor(pDC, pWnd, nCtlColor);&lt;br /&gt;
	&lt;br /&gt;
	//фон диалога (или вьюшки)&lt;br /&gt;
	if(nCtlColor==CTLCOLOR_DLG)&lt;br /&gt;
	{&lt;br /&gt;
		return (HBRUSH)br;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	//фон статиков (если нужно)&lt;br /&gt;
	if(nCtlColor==CTLCOLOR_STATIC)&lt;br /&gt;
	{&lt;br /&gt;
		//делаем фон текста статика прозрачным&lt;br /&gt;
		pDC-&amp;gt;SetBkMode(TRANSPARENT);&lt;br /&gt;
		return (HBRUSH)br;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	return hbr;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Почему на моем компьютере экзешник, созданный в MFC запускается, а на других компьютерах - нет? Требует какую-то  dll-ку.===&lt;br /&gt;
Нужно выбирать режим Release :&lt;br /&gt;
&lt;br /&gt;
Menu-&amp;gt;Build-&amp;gt;Configurations...-&amp;gt;Release,&lt;br /&gt;
&lt;br /&gt;
и экзешник, соответственно, брать из папки Release проекта&lt;br /&gt;
===Как в диалог добавить меню?===&lt;br /&gt;
Надо сделать в ресурсах меню, затем вставить в диалог:&lt;br /&gt;
&lt;br /&gt;
открыть в редакторе диалог, в свойствах (во вкладке General, окошко Menu) указать идентивикатор ресурса меню.&lt;br /&gt;
При помощи визарда добавить для меню обработчики OnCommand() и OnUpdateСommand().&lt;br /&gt;
===Я добавил визардом меню в диалог. Добавил обработчики для пунктов меню. Пункты работают, но OnUpdate для пунктов не вызывается - то есть не получается ни затенить, ни чек поставить. Что делать?===&lt;br /&gt;
В диалоге у меню апдейта не происходит сам, в отличие от мейнфрейма.&lt;br /&gt;
Для этого нужно сделать самим апдейт в обработчике сообщения WM_KICKIDLE.&lt;br /&gt;
Визардом обработчик не добавляется, поэтому можно переопределить виртуальную DefWindowProc() и там обработать:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;afxpriv.h&amp;gt;	//этот файл надо включить, там определёна WM_KICKIDLE&lt;br /&gt;
&lt;br /&gt;
LRESULT CMyDialog::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam) &lt;br /&gt;
{&lt;br /&gt;
	if(message==WM_KICKIDLE)&lt;br /&gt;
	{&lt;br /&gt;
		//делаем апдейт для всех пунктов меню&lt;br /&gt;
		CMenu* pMainMenu=GetMenu();&lt;br /&gt;
		if(pMainMenu)&lt;br /&gt;
		{&lt;br /&gt;
			CCmdUI cmdUI;&lt;br /&gt;
			for (UINT n=0; n &amp;lt; pMainMenu-&amp;gt;GetMenuItemCount(); ++n)&lt;br /&gt;
			{&lt;br /&gt;
				CMenu* pSubMenu = pMainMenu-&amp;gt;GetSubMenu(n);&lt;br /&gt;
				if(!pSubMenu)continue;&lt;br /&gt;
	&lt;br /&gt;
				cmdUI.m_nIndexMax = pSubMenu-&amp;gt;GetMenuItemCount();&lt;br /&gt;
				for (UINT i = 0; i &amp;lt; cmdUI.m_nIndexMax;++i)&lt;br /&gt;
				{&lt;br /&gt;
					cmdUI.m_nIndex = i;&lt;br /&gt;
					cmdUI.m_nID = pSubMenu-&amp;gt;GetMenuItemID(i);&lt;br /&gt;
					cmdUI.m_pMenu = pSubMenu;&lt;br /&gt;
					cmdUI.DoUpdate(this, FALSE);&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	return CDialog::DefWindowProc(message, wParam, lParam);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Как на Visual C++ 6.0 в Главном окне отключить системное меню (в левом верхнем углу) и кнопки(в правом верхнем углу)?===&lt;br /&gt;
При создании окна нужно убрать стиль WS_SYSMENU&lt;br /&gt;
(теперь пользователь корректно может закрыть окно только Alt+F4,&lt;br /&gt;
ну или если вы предоставите ему дополнительную возможность сделать это)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пример 1. (для SDI, MDI)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//этот обработчик уже добавлен визардом&lt;br /&gt;
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT&amp;amp; cs)&lt;br /&gt;
{&lt;br /&gt;
	if( !CFrameWnd::PreCreateWindow(cs) )&lt;br /&gt;
		return FALSE;&lt;br /&gt;
	// TODO: Modify the Window class or styles here by modifying&lt;br /&gt;
	//  the CREATESTRUCT cs&lt;br /&gt;
&lt;br /&gt;
	///////////////////////////////&lt;br /&gt;
	//добавленная часть&lt;br /&gt;
	{&lt;br /&gt;
		//убираем стиль&lt;br /&gt;
		cs.style&amp;amp;=~WS_SYSMENU;&lt;br /&gt;
	}&lt;br /&gt;
	///////////////////////////////&lt;br /&gt;
&lt;br /&gt;
	return TRUE;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Пример 2. (для диалога)&lt;br /&gt;
Если диалог описан в ресурсах, то в свойствах диалога убрать галочки&lt;br /&gt;
  &amp;quot;System menu&amp;quot;&lt;br /&gt;
  &amp;quot;Minimize box&amp;quot;&lt;br /&gt;
  &amp;quot;Maximize box&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===Хочу сделать так, чтобы пользователь не мог нажать на кнопку, пока программа не разрешит.===&lt;br /&gt;
Нужно применить метод класса CWnd::EnableWindow(...) для кнопки.&lt;br /&gt;
Значение параметра 0 делает кнопку неактивной, 1 - делает активной.&lt;br /&gt;
(кстате, не только для кнопки можно, а для любого класса, производного&lt;br /&gt;
от класса CWnd)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пусть имеется некий диалог, на нём лежит кнопка c ID == IDC_1.&lt;br /&gt;
в любом месте кода диалога (кроме конструктора и деструктора , хотя, если&lt;br /&gt;
проверить наличие валидного хендла диалога, как в примере, то ничего&lt;br /&gt;
страшного не будет и там)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//делаем кнопку неактивной&lt;br /&gt;
if(m_hWnd)&lt;br /&gt;
{&lt;br /&gt;
	CWnd* pw=0;&lt;br /&gt;
	pw=GetDlgItem(IDC_1);&lt;br /&gt;
	if(pw)pw-&amp;gt;EnableWindow(0);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Что означают сообщения, которые студия выводит при компиляции, вроде таких : Loaded 'C:\WINDOWS\SYSTEM\WSOCK32.DLL', no matching symbolic information found. ===&lt;br /&gt;
Это строка говорит о том, что студия не смогла найти отладочные&lt;br /&gt;
символы для WSOCK32.DLL. В этом нет ничего страшного, просто при наличии&lt;br /&gt;
отладочных символов в процессе отладки можно получить доступ к именам&lt;br /&gt;
функции из системных DLL. Например, вместо&lt;br /&gt;
 KERNEL32! 0x77E8B184() -&lt;br /&gt;
 увидим&lt;br /&gt;
 KERNEL32!CreateThread.&lt;br /&gt;
===Как обработать сообщения, которое приходит к некому контролу (скажем CEdit)?===&lt;br /&gt;
Нужно произвести от CEdit свой класс, и в виртуальной процедуре класса WindowProc перехватить нужные сообщения.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
virtual LRESULT WindowProc(&lt;br /&gt;
   UINT message,&lt;br /&gt;
   WPARAM wParam,&lt;br /&gt;
   LPARAM lParam &lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Пример. Полностью выключаем, скажем, обработку сообщения WM_CHAR&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	LRESULT CMyEdit::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) &lt;br /&gt;
	{&lt;br /&gt;
		switch(message)&lt;br /&gt;
		{&lt;br /&gt;
			case WM_CHAR:&lt;br /&gt;
			{&lt;br /&gt;
				return 0;&lt;br /&gt;
			}&lt;br /&gt;
			break;&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		return CEdit::WindowProc(message, wParam, lParam);&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Чтобы связать экземпляр класса с контролом на форме, добавьте визардом для&lt;br /&gt;
контрола переменную класса (выбрав не Value а Control).&lt;br /&gt;
&lt;br /&gt;
===Как настроить количество пробелов в табуляции?===&lt;br /&gt;
Tools-&amp;gt;Options-&amp;gt;Tabs-&amp;gt;Insert Spaces&lt;br /&gt;
(или  правой кнопкой мыши по тексту-&amp;gt; properties)&lt;br /&gt;
===Как автоматически расставить отступы?===&lt;br /&gt;
Выделить текст для форматирования, нажать Alt+F8&lt;br /&gt;
&lt;br /&gt;
Есть ещё программа Artistic Style, которая занимается&lt;br /&gt;
переформатированием кода&lt;br /&gt;
http://sourceforge.net/projects/astyle/&lt;br /&gt;
===Поиск границ блока===&lt;br /&gt;
&amp;quot;CTRL+ }&amp;quot; ищет парную фигурную скобку в тексте и переходит на неё&lt;br /&gt;
===Вертикальное выделение текста===&lt;br /&gt;
&amp;quot;Alt + выделение мышкой&amp;quot; - позволяет выделять вертикальные фрагменты текста&lt;br /&gt;
===Как узнать количество установленных в CListCtrl столбцов ?===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CListCtrl* pL=...; //указатель на переменную-контрол&lt;br /&gt;
&lt;br /&gt;
int count=pL-&amp;gt;GetHeaderCtrl()-&amp;gt;GetItemCount();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как получить иконку приложения?===&lt;br /&gt;
Если приложение запущено, то нужно найти его главное окно и&lt;br /&gt;
послать ему сообщение WM_GETICON.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//функция возвращант хендл иконки &lt;br /&gt;
LRESULT SendMessage(hWnd, WM_GETICON, wParam, 0);&lt;br /&gt;
&lt;br /&gt;
//hWnd == хендл окна приложения&lt;br /&gt;
//wParam == &lt;br /&gt;
//	1)==ICON_BIG - получить большую иконку&lt;br /&gt;
//	2)==ICON_SMALL - получить маленькую иконку&lt;br /&gt;
//	3)==ICON_SMALL2 - получить маленькую иконку, если она определена&lt;br /&gt;
//				в приложении. Если её нет, то маленькую иконку, &lt;br /&gt;
//				сгенерированную системой из большой иконки&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как в CString можно найти или вырезать часть строки?===&lt;br /&gt;
есть такие методы в CString :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//вырезает кусок строки&lt;br /&gt;
CString Mid(int nFirst) const;&lt;br /&gt;
CString Mid(int nFirst,  int nCount) const;&lt;br /&gt;
&lt;br /&gt;
//возвращает кусок строки (сначала или с конца)&lt;br /&gt;
CString Left(int nCount ) const;&lt;br /&gt;
CString Right(int nCount ) const;&lt;br /&gt;
&lt;br /&gt;
//возвращает начальный кусок строки, в котором есть только&lt;br /&gt;
//символы из набора,представленного в lpszCharSet&lt;br /&gt;
CString SpanIncluding(LPCTSTR lpszCharSet ) const;&lt;br /&gt;
&lt;br /&gt;
//возвращает начальный кусок строки, в котором нет&lt;br /&gt;
//символов из набора,представленного в lpszCharSet&lt;br /&gt;
CString SpanExcluding(LPCTSTR lpszCharSet ) const; &lt;br /&gt;
&lt;br /&gt;
//убирает &amp;quot;пробелоподобные&amp;quot; символы из самого начала строки&lt;br /&gt;
//(то есть - пробел, табуляцию (\t) , возврат каретки, перевод строки (/r/n))&lt;br /&gt;
void TrimLeft();&lt;br /&gt;
//убирает все повторы символа из самого начала строки&lt;br /&gt;
void TrimLeft(TCHAR chTarget );&lt;br /&gt;
//убирает из самого начала строки все символа из набора lpszTargets &lt;br /&gt;
void TrimLeft(LPCTSTR lpszTargets ); &lt;br /&gt;
&lt;br /&gt;
void TrimRight();&lt;br /&gt;
void TrimRight(TCHAR chTarget );&lt;br /&gt;
void TrimRight(LPCTSTR lpszTargets ); &lt;br /&gt;
&lt;br /&gt;
//поиск в строке&lt;br /&gt;
int Find( TCHAR ch ) const;&lt;br /&gt;
int Find( LPCTSTR lpszSub ) const;&lt;br /&gt;
int Find( TCHAR ch, int nStart ) const;&lt;br /&gt;
int Find( LPCTSTR pstr, int nStart ) const;&lt;br /&gt;
&lt;br /&gt;
//поиск, начиная с конца&lt;br /&gt;
int ReverseFind( TCHAR ch ) const;&lt;br /&gt;
&lt;br /&gt;
//поиск позиции первого символа, одного из набора,&lt;br /&gt;
// представленного в lpszCharSet&lt;br /&gt;
int FindOneOf( LPCTSTR lpszCharSet ) const;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Есть у меня CListBox и я в ходе выполнения программы добавляю в него строки. Но я не могу посмотреть что именно добавляется. Вывод результатов происходит в конце выполнения процедуры...===&lt;br /&gt;
Если нужно делать принудительную перерисовку окна во время&lt;br /&gt;
длительных вычислений, то нужно вызывать для окна, которое&lt;br /&gt;
надо перерисовать метод&lt;br /&gt;
  RedrawWindow()&lt;br /&gt;
с параметрами по умолчанию, или пару&lt;br /&gt;
  Invalidate(0);&lt;br /&gt;
  UpdateWindow();&lt;br /&gt;
Это приводит к пометке всего окна к перерисовке и отправлению&lt;br /&gt;
сообщения WM_PAINT в оконную процедуру в обход очереди&lt;br /&gt;
сообщений, вызывая немедленную перерисовку окна.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CWnd* pw=...;//окно , которое надо перерисовывать&lt;br /&gt;
&lt;br /&gt;
for(int i=0;i&amp;lt;10000)&lt;br /&gt;
{&lt;br /&gt;
	//меняется содержимое окна&lt;br /&gt;
	//...&lt;br /&gt;
&lt;br /&gt;
	//немедленная перерисовка&lt;br /&gt;
	pw-&amp;gt;Invalidate(0);&lt;br /&gt;
	pw-&amp;gt;UpdateWindow();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Я написал DLL , которую используют несколько приложений. Всё вроде работает, но когда происходит очередной вызов функции из DLL , почему то данные в функции обнуляются. С чем это связано ?===&lt;br /&gt;
Переменные и массивы в DLL, содержимое которых должно использоваться несколькими процессами, должны объявляться статическими. Статическая переменная или массив инициализируются только один раз в момент загрузки DLL.&lt;br /&gt;
Пример:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DWORD calltest()&lt;br /&gt;
{&lt;br /&gt;
	//будет выполнено только при первом вызове&lt;br /&gt;
	static DWORD callcount=0;&lt;br /&gt;
	static DWORD str[1000]={0}; &lt;br /&gt;
&lt;br /&gt;
	//будет выполняться каждый раз&lt;br /&gt;
	return ++callcount;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как открыть проекцию файла в память и как с ней работать?===&lt;br /&gt;
Как открыть проекцию файла в память и как с ней работать?&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HANDLE CreateFileMapping(&lt;br /&gt;
  HANDLE hFile,	//хендл уже открытого файла&lt;br /&gt;
  LPSECURITY_ATTRIBUTES lpAttributes,&lt;br /&gt;
  DWORD flProtect,	//способ открытия проекции&lt;br /&gt;
  DWORD dwMaximumSizeHigh,	//размер файла (старшие 4 байта , обычно==0)&lt;br /&gt;
  DWORD dwMaximumSizeLow,	//размер файла (младшие 4 байта)&lt;br /&gt;
  LPCTSTR lpName&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Доступ к созданной проекции производится процедурой&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LPVOID MapViewOfFile(&lt;br /&gt;
  HANDLE hFileMappingObject, //хендл проекции&lt;br /&gt;
  DWORD dwDesiredAccess,	//способ работы с проекцией&lt;br /&gt;
  DWORD dwFileOffsetHigh,&lt;br /&gt;
  DWORD dwFileOffsetLow, //смещение от начала файла (младшие 4 байта)&lt;br /&gt;
  SIZE_T dwNumberOfBytesToMap //длина в байтах (если ==0 - то весь файл)&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
далее с файлом можно работать как с обычным массивом в памяти.&lt;br /&gt;
&lt;br /&gt;
После работы с проекцией , её надо освободить процедурой&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
BOOL UnmapViewOfFile(&lt;br /&gt;
  LPCVOID lpBaseAddress //адрес, который вернула процедура MapViewOfFile&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Пример.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HANDLE hMapFile=0;//для проекции&lt;br /&gt;
&lt;br /&gt;
HANDLE hFile=...;//хендл уже открытого файла&lt;br /&gt;
DWORD dwdFileLen=...;//размер открытого файла&lt;br /&gt;
&lt;br /&gt;
//создаём проекцию &amp;quot;только для чтения&amp;quot;&lt;br /&gt;
hMapFile=::CreateFileMapping(hFile,0,PAGE_READONLY,0,dwdFileLen,0);&lt;br /&gt;
&lt;br /&gt;
//хендл hFile можно закрыть уже здесь, в принципе,&lt;br /&gt;
//но мы сделаем это позже&lt;br /&gt;
&lt;br /&gt;
//получаем доступ к проекции (тоже только для чтения)&lt;br /&gt;
BYTE* pbyFile=(BYTE*)::MapViewOfFile(hMapFile,FILE_MAP_READ,0,0,0);&lt;br /&gt;
&lt;br /&gt;
///////////////////&lt;br /&gt;
//тут работаем с массивом pbyFile[dwdFileLen] как с обычным,&lt;br /&gt;
//только не забываем, что он открыт только для чтения&lt;br /&gt;
//...&lt;br /&gt;
//...&lt;br /&gt;
//...&lt;br /&gt;
///////////////////&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//отключаем файл данных от адресного пространства&lt;br /&gt;
UnmapViewOfFile(pbyFile);&lt;br /&gt;
&lt;br /&gt;
//освобождаем хендл проекции&lt;br /&gt;
CloseHandle(hMapFile)&lt;br /&gt;
&lt;br /&gt;
//освобождаем хендл открытого файла&lt;br /&gt;
CloseHandle(hFile);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Использую MFC Grid control 2.25 , не получается отобразить картинку в ячейке. Как это делается ?===&lt;br /&gt;
Нужно создать список изображений (CImageList) , затем передать указатель на список в контрол. Поскольку контрол лишь копирует указатель , список должен создаваться динамически, либо быть членом класса, экземпляр которого существует всё время работы контрола.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 m_GridMarket&lt;br /&gt;
CImageList m_ImageList;&lt;br /&gt;
CGridCtrL m_Grid1&lt;br /&gt;
...&lt;br /&gt;
...&lt;br /&gt;
//неким образом создаётся список&lt;br /&gt;
m_ImageList.Create(...);&lt;br /&gt;
//...&lt;br /&gt;
&lt;br /&gt;
//вставляем в контрол&lt;br /&gt;
m_Grid1.SetImageList(&amp;amp;m_ImageList);&lt;br /&gt;
&lt;br /&gt;
//&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как при помощи IPicture отобразить картинку из файла? ===&lt;br /&gt;
Пример - несложная функция, отображающая картинку из файла&lt;br /&gt;
&lt;br /&gt;
поддерживаются форматы&lt;br /&gt;
BMP, GIF, JPEG, PNG, TIFF, EMF&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;quot;atlconv.h&amp;quot;&lt;br /&gt;
#define HandleIsValid(H) (H!=(HANDLE)-1 &amp;amp;&amp;amp; H!=(HANDLE)0)&lt;br /&gt;
&lt;br /&gt;
//*pDestDC - CDC, на который предполагается вывод картинки&lt;br /&gt;
//pchzFilePath - путь к файлу&lt;br /&gt;
//pWid - (возвращает) ширина картинки&lt;br /&gt;
//pHig - (возвращает) высота картинки&lt;br /&gt;
bool DrawBitmapFromFile(CDC* pDestDC,const char* pchzFilePath,int *pWid=0,int *pHig=0)&lt;br /&gt;
{&lt;br /&gt;
	bool result=false;&lt;br /&gt;
&lt;br /&gt;
	if(pWid)*pWid=0;&lt;br /&gt;
	if(pHig)*pHig=0;&lt;br /&gt;
&lt;br /&gt;
	int Wid=0;&lt;br /&gt;
	int Hig=0;&lt;br /&gt;
&lt;br /&gt;
	IPicture* pPic=0;&lt;br /&gt;
	try&lt;br /&gt;
	{&lt;br /&gt;
		IPicture* ptmpPic=0;&lt;br /&gt;
		USES_CONVERSION;&lt;br /&gt;
		HRESULT hr;&lt;br /&gt;
&lt;br /&gt;
		CString txt=pchzFilePath;&lt;br /&gt;
		hr= ::OleLoadPicturePath(&lt;br /&gt;
			const_cast&amp;lt;LPOLESTR&amp;gt;(T2COLE(txt)),&lt;br /&gt;
			0,0,0,IID_IPicture,&lt;br /&gt;
			reinterpret_cast&amp;lt;void **&amp;gt;(&amp;amp;ptmpPic)&lt;br /&gt;
			);&lt;br /&gt;
&lt;br /&gt;
		if(hr==S_OK &amp;amp;&amp;amp; ptmpPic)&lt;br /&gt;
		{&lt;br /&gt;
			pPic=ptmpPic;&lt;br /&gt;
		}&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			throw 0;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		OLE_XPOS_HIMETRIC cxSrc;&lt;br /&gt;
		OLE_YPOS_HIMETRIC cySrc;&lt;br /&gt;
&lt;br /&gt;
		if(S_OK!=pPic-&amp;gt;get_Width(&amp;amp;cxSrc))throw 0;&lt;br /&gt;
		if(S_OK!=pPic-&amp;gt;get_Height(&amp;amp;cySrc))throw 0;&lt;br /&gt;
&lt;br /&gt;
		Wid=cxSrc/26;&lt;br /&gt;
		Hig=cySrc/26;&lt;br /&gt;
&lt;br /&gt;
		//рисуем&lt;br /&gt;
		if(S_OK !=pPic-&amp;gt;Render(pDestDC-&amp;gt;GetSafeHdc(),&lt;br /&gt;
			0,Hig,Wid,-Hig,0,0,cxSrc,cySrc,0))throw 0;&lt;br /&gt;
	}&lt;br /&gt;
	catch(...)&lt;br /&gt;
	{&lt;br /&gt;
		result=false;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if(pPic)&lt;br /&gt;
	{&lt;br /&gt;
		pPic-&amp;gt;Release();&lt;br /&gt;
		pPic=0;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	if(pWid)*pWid=Wid;&lt;br /&gt;
	if(pHig)*pHig=Hig;&lt;br /&gt;
&lt;br /&gt;
	return result;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===У меня модальное диалоговое окно, в нем поле редактирования мультилайновое, т.е. чтобы перейти на новую строку надо нажать ентер, но вызывается стандартный обработчик диалогового окна. Подскажите, что делать?===&lt;br /&gt;
Нужно в редакторе ресурсов поставить для CEdit окошка галочку&lt;br /&gt;
свойства WantReturn,&lt;br /&gt;
&lt;br /&gt;
или добавить ES_WANTRETURN при создании CEdit контрола динамически.&lt;br /&gt;
===Как выводят картинку-логотип(splash screen) при запуске программы? То есть, когда загружается программа на экран выводится картинка, потом она исчезает(загрузка программы закончена) и пользователь может приступать к работе ===&lt;br /&gt;
Для этого используется класс, производный от CDialog. Этот диалог после создания показывает себя на экран, выводя на себя рисунок. Также запускает таймет, по срабатывани которого диалог гасится. Создаётся диалог InitInstance приложения.&lt;br /&gt;
&lt;br /&gt;
В VC6++ также есть уже готовый компонент&lt;br /&gt;
Project-&amp;gt;Add To Project -&amp;gt; Components and Controls-&amp;gt;(в папке &amp;quot;Visual C++ Components&amp;quot; есть SplashScreen.)&lt;br /&gt;
===Как сделать, чтобы при выпадении списка у ComboBox была не одна строка, а больше, вроде все свойства покрутил, не помогает Вместо выпадающего списка одна строка и скролл...===&lt;br /&gt;
В редакторе ресурсов надо щелкнуть в комбобоксе на треугольнике - появляется рамка для растягивания вниз - размер выпадающего списка.&lt;br /&gt;
===В VC++.net , что делать после того, как на форму установил ActiiveX ListView, как объявить класс и переменную для этого элемента?===&lt;br /&gt;
Щёлкнуть правой кнопкой мыши на элементе , в меню - add variable или add class&lt;br /&gt;
===Как вставить данные в буфер обмена (Clipboard) ? Как их оттуда вытащить ?===&lt;br /&gt;
&lt;br /&gt;
1) копирование в буфер обмена:&lt;br /&gt;
&lt;br /&gt;
  1.Готовим данные&lt;br /&gt;
    а.Выделяем память из кучи,  вызывая GlobalAlloc()&lt;br /&gt;
    б.Получаем указатель на выделенную память, вызывая GlobalLock()&lt;br /&gt;
    в.Заполняем данные&lt;br /&gt;
    г.Освобождаем указатель , вызывая GlobalUnlock();&lt;br /&gt;
&lt;br /&gt;
  2.Открываем буфер обмена , вызывая OpenClipboard();&lt;br /&gt;
  3.Очищаем буфер, вызывая EmptyClipboard();&lt;br /&gt;
  4.Вызываем SetClipboardData() один раз для каждого формата&lt;br /&gt;
      вставляемых данных (имеется в виду - если одни и те же&lt;br /&gt;
      данные представлены в разных форматах, и приложение&lt;br /&gt;
      может эти форматы создать)&lt;br /&gt;
  5.Закрываем буфер, вызывая CloseClipboard();&lt;br /&gt;
  6.ВЫЗЫВАТЬ GlobalFree() НЕ НУЖНО , в этом случае это&lt;br /&gt;
      предоставлено системе&lt;br /&gt;
&lt;br /&gt;
Скажем, хотим поместить в буфер обмена туда текст.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	//готовим данные&lt;br /&gt;
	//выделяем из кучи память для данных&lt;br /&gt;
	HANDLE hglbCopy = GlobalAlloc(GMEM_MOVEABLE,10);&lt;br /&gt;
	if(!hglbCopy)return;&lt;br /&gt;
&lt;br /&gt;
	//получаем указатель&lt;br /&gt;
	void* lpStr = GlobalLock(hglbCopy);&lt;br /&gt;
	if(!lpStr)return;&lt;br /&gt;
&lt;br /&gt;
	//заполняем данные&lt;br /&gt;
	strcpy((char*)lpStr,&amp;quot;my text&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	//освобождаем указатель&lt;br /&gt;
	GlobalUnlock(hglbCopy);&lt;br /&gt;
	lpStr=0;&lt;br /&gt;
&lt;br /&gt;
	//открываем буфер обмена&lt;br /&gt;
	OpenClipboard();&lt;br /&gt;
	//очищаем&lt;br /&gt;
	EmptyClipboard();&lt;br /&gt;
&lt;br /&gt;
	//текстовый формат&lt;br /&gt;
	SetClipboardData(CF_TEXT,hglbCopy);&lt;br /&gt;
&lt;br /&gt;
	//закрываем буфер&lt;br /&gt;
	CloseClipboard();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
2) извлечение из буфера обмена&lt;br /&gt;
&lt;br /&gt;
  1.Проверяем, что поддерживается нужный формат данных,&lt;br /&gt;
      вызывая IsClipboardFormatAvailable()&lt;br /&gt;
  2.Открываем буфер обмена , вызывая OpenClipboard();&lt;br /&gt;
  3.Достаём данные&lt;br /&gt;
   а.Получаем из буфера хендл требуемого формата,&lt;br /&gt;
      вызывая GetClipboardData()&lt;br /&gt;
    б.Получаем указатель на выделенную память, вызывая GlobalLock()&lt;br /&gt;
    в.Работаем с данными&lt;br /&gt;
    г.Освобождаем указатель , вызывая GlobalUnlock();&lt;br /&gt;
  4.Закрываем буфер, вызывая CloseClipboard();&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	//Проверяем, что поддерживается нужный формат данных,&lt;br /&gt;
	if(!IsClipboardFormatAvailable(CF_TEXT))return;&lt;br /&gt;
&lt;br /&gt;
	//открываем буфер обмена&lt;br /&gt;
	OpenClipboard();&lt;br /&gt;
&lt;br /&gt;
	//достаём данные&lt;br /&gt;
&lt;br /&gt;
	//текстовый формат&lt;br /&gt;
	HANDLE hglbCopy = GetClipboardData(CF_TEXT);&lt;br /&gt;
	if(!hglbCopy)return;&lt;br /&gt;
&lt;br /&gt;
	//получаем указатель&lt;br /&gt;
	void* lpStr = GlobalLock(hglbCopy);&lt;br /&gt;
	if(!lpStr)return;&lt;br /&gt;
&lt;br /&gt;
	//читаем данные&lt;br /&gt;
	char data[10];&lt;br /&gt;
	memmove(data,lpStr,sizeof(data));&lt;br /&gt;
&lt;br /&gt;
	//освобождаем указатель&lt;br /&gt;
	GlobalUnlock(hglbCopy);&lt;br /&gt;
	lpStr=0;&lt;br /&gt;
&lt;br /&gt;
	//закрываем буфер&lt;br /&gt;
	CloseClipboard();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как получить полный путь к экзешнику из самой программы ?===&lt;br /&gt;
В командную строку первым параметром система всегда передаёт заключённый в кавычки полный путь к файлу запущенной программы Достаём путь таким образом :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
BOOL CMyApp::InitInstance()&lt;br /&gt;
{&lt;br /&gt;
	//добыча полного имени экзешника&lt;br /&gt;
	CString csFullExeName;&lt;br /&gt;
	{&lt;br /&gt;
		CString csAppName=GetCommandLine();&lt;br /&gt;
		csAppName.Delete(0,1);&lt;br /&gt;
		csAppName.Replace('\&amp;quot;','\0');&lt;br /&gt;
		csFullExeName=(const char*)csAppName;&lt;br /&gt;
	}&lt;br /&gt;
	//теперь csFullExeName - содержит искомый путь&lt;br /&gt;
&lt;br /&gt;
	//...&lt;br /&gt;
	//...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Каким способом можно exe файл может заменить самого себя? То есть, моя программа обновляется, например, через Internet, и хочет обновить свой exe-файл. Но так как он в данный момент запущен - это будет, естественно, запрещено. Как это можно проще всего сделать?===&lt;br /&gt;
Один из способов - сделать копию экзешника и из него обновиться&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define def_exeNAMEup	&amp;quot;c:\\myprog_update.exe&amp;quot;&lt;br /&gt;
#define def_exeNAMEdnld	&amp;quot;c:\\myprog_downloaded.exe&amp;quot;&lt;br /&gt;
#define def_keyUdate	&amp;quot;/update&amp;quot;&lt;br /&gt;
&lt;br /&gt;
void CTESTFAQApp::UpdateItself()&lt;br /&gt;
{&lt;br /&gt;
	//добыча полного имени экзешника&lt;br /&gt;
	CString csFullExeName;&lt;br /&gt;
	{&lt;br /&gt;
		CString csAppName=GetCommandLine();&lt;br /&gt;
		csAppName.Delete(0,1);&lt;br /&gt;
		csAppName.Replace('\&amp;quot;','\0');&lt;br /&gt;
		csFullExeName=(const char*)csAppName;&lt;br /&gt;
	}&lt;br /&gt;
	//теперь csFullExeName - содержит искомый путь&lt;br /&gt;
&lt;br /&gt;
	//делаем копию экзешника с другим именем&lt;br /&gt;
	CopyFile(csFullExeName,def_exeNAMEup,0);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	//передаём в параметры нового процесса ключ и путь к текущему файлу&lt;br /&gt;
	CString csParams=def_keyUdate;&lt;br /&gt;
	csParams+=&amp;quot; &amp;quot;;&lt;br /&gt;
	csParams+=csFullExeName;&lt;br /&gt;
&lt;br /&gt;
	//запускаем копию&lt;br /&gt;
	STARTUPINFO si;&lt;br /&gt;
	PROCESS_INFORMATION pi;&lt;br /&gt;
	ZeroMemory(&amp;amp;si,sizeof(si));&lt;br /&gt;
	si.cb = sizeof(si);&lt;br /&gt;
	ZeroMemory(&amp;amp;pi,sizeof(pi));&lt;br /&gt;
	if(CreateProcess(def_exeNAMEup,def_keyUdate,0,0,0,0,0,0,&amp;amp;si,&amp;amp;pi))&lt;br /&gt;
	{&lt;br /&gt;
		//завершаем текущий процесс&lt;br /&gt;
		ExitFromMyApp();&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void CTESTFAQApp::ExitFromMyApp()&lt;br /&gt;
{&lt;br /&gt;
	exit(0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
BOOL CTESTFAQApp::InitInstance()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
	//смотрим, не запустили ли для апдейта?&lt;br /&gt;
&lt;br /&gt;
	CString txt;&lt;br /&gt;
	txt=m_lpCmdLine;&lt;br /&gt;
	if(txt.Find(def_keyUdate)==0)&lt;br /&gt;
	{&lt;br /&gt;
		//делаем айдейт&lt;br /&gt;
		txt.Replace(def_keyUdate,&amp;quot;&amp;quot;);&lt;br /&gt;
		txt.TrimLeft();&lt;br /&gt;
&lt;br /&gt;
		CString csFullExeName=txt;&lt;br /&gt;
&lt;br /&gt;
		//берём откуда то уже скачанный файл обновления&lt;br /&gt;
		//...&lt;br /&gt;
		CString csFull_Downloaded_ExeName=def_exeNAMEdnld;&lt;br /&gt;
&lt;br /&gt;
		//копируем файл (обновляем старый то есть)&lt;br /&gt;
		CopyFile(csFull_Downloaded_ExeName,csFullExeName,0);&lt;br /&gt;
&lt;br /&gt;
		//запускаем обновлённого мученника&lt;br /&gt;
		STARTUPINFO si;&lt;br /&gt;
		PROCESS_INFORMATION pi;&lt;br /&gt;
		ZeroMemory(&amp;amp;si,sizeof(si));&lt;br /&gt;
		si.cb = sizeof(si);&lt;br /&gt;
		ZeroMemory(&amp;amp;pi,sizeof(pi));&lt;br /&gt;
		if(CreateProcess(csFullExeName,0,0,0,0,0,0,0,&amp;amp;si,&amp;amp;pi))&lt;br /&gt;
&lt;br /&gt;
		ExitFromMyApp();&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
	//...&lt;br /&gt;
	//...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Есть строка символов (страничка из Инета) в кодировке utf-8 (строка char*). Как мне ее получить в формате String&lt;br /&gt;
или в char* в кодировке ANSI (cp 1251) ?===&lt;br /&gt;
Можно перевести строку из UTF8 в Unicode, затем из Unicode в 1251&lt;br /&gt;
&lt;br /&gt;
Ниже приведена структура, содержащая процедуры перекодирования,&lt;br /&gt;
а также процедуру с примером использования&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//описание структуры&lt;br /&gt;
struct coder&lt;br /&gt;
{&lt;br /&gt;
	//utf8-&amp;gt;unicode&lt;br /&gt;
	static wchar_t* utf8_to_unicode__dontForgetDeleteArr(const char *utf8_string)&lt;br /&gt;
	{&lt;br /&gt;
		wchar_t* pRes=0;&lt;br /&gt;
		int res_len=0;&lt;br /&gt;
&lt;br /&gt;
		//тест на возможность преобразования&lt;br /&gt;
		res_len=MultiByteToWideChar(CP_UTF8,0,utf8_string,-1,0,0);&lt;br /&gt;
		if(!res_len)return 0;&lt;br /&gt;
&lt;br /&gt;
		//выделяем память&lt;br /&gt;
		pRes = new wchar_t[res_len];&lt;br /&gt;
		if(!pRes)return 0;&lt;br /&gt;
&lt;br /&gt;
		//преобразование&lt;br /&gt;
		if(!MultiByteToWideChar(CP_UTF8,0,utf8_string,-1,pRes,res_len))&lt;br /&gt;
		{&lt;br /&gt;
			delete [] pRes;&lt;br /&gt;
			return 0;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		return pRes;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	//unicode-&amp;gt;1251&lt;br /&gt;
	static char * unicode_to_1251__dontForgetDeleteArr(const wchar_t *unicode_string)&lt;br /&gt;
	{&lt;br /&gt;
		char* pRes=0;&lt;br /&gt;
		int res_len=0;&lt;br /&gt;
&lt;br /&gt;
		//тест на возможность преобразования&lt;br /&gt;
		res_len = WideCharToMultiByte(1251,0,unicode_string,-1,0,0,0,0);&lt;br /&gt;
		if(!res_len)return 0;&lt;br /&gt;
&lt;br /&gt;
		//выделяем память&lt;br /&gt;
		pRes=new char[res_len];&lt;br /&gt;
		if(!pRes)return 0;&lt;br /&gt;
&lt;br /&gt;
		//преобразование&lt;br /&gt;
		if(!WideCharToMultiByte(1251,0,unicode_string,-1,pRes,res_len,0,0))&lt;br /&gt;
		{&lt;br /&gt;
			delete [] pRes;&lt;br /&gt;
			return 0;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		return pRes;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	//процедура с примером&lt;br /&gt;
	static void Example()&lt;br /&gt;
	{&lt;br /&gt;
		wchar_t* unicode_string=0;&lt;br /&gt;
		char* cp1251_string=0;&lt;br /&gt;
&lt;br /&gt;
		//исходный текст&lt;br /&gt;
		char utf8_string[] = &amp;quot;UTF-8 + СЂСѓСЃСЃРєРёР№ С‚РµРєСЃС‚&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
		for(;;)&lt;br /&gt;
		{&lt;br /&gt;
&lt;br /&gt;
			unicode_string=utf8_to_unicode__dontForgetDeleteArr(utf8_string);&lt;br /&gt;
			if(!unicode_string)&lt;br /&gt;
			{&lt;br /&gt;
				AfxMessageBox(&amp;quot;Не удалось конвертировать в unicode!&amp;quot;);&lt;br /&gt;
				break;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			cp1251_string = unicode_to_1251__dontForgetDeleteArr(unicode_string);&lt;br /&gt;
&lt;br /&gt;
			if(!cp1251_string)&lt;br /&gt;
			{&lt;br /&gt;
				AfxMessageBox(&amp;quot;Не удалось конвертировать из unicode!&amp;quot;);&lt;br /&gt;
				break;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			break;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		//cp1251_string - результат&lt;br /&gt;
		AfxMessageBox(cp1251_string);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
		//не забываем удалить массивы&lt;br /&gt;
		if(unicode_string)&lt;br /&gt;
		{&lt;br /&gt;
			delete [] unicode_string;&lt;br /&gt;
			unicode_string=0;&lt;br /&gt;
		}&lt;br /&gt;
		if(cp1251_string)&lt;br /&gt;
		{&lt;br /&gt;
			delete [] cp1251_string;&lt;br /&gt;
			cp1251_string=0;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
//вызов примера&lt;br /&gt;
coder::Example();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как организовать взаимодействие программы на VC.net с Access-овской базой данных?===&lt;br /&gt;
Проще всего подключить ADO компоненты и сделать все на них.&lt;br /&gt;
Компоненты  ADO (ADODC,DATAGRID и т.п.) это ActiveX.&lt;br /&gt;
В редакторе ресурсов, во всплывающем меню, есть Insert ActiveX Control -&amp;gt; открывается список всех компоент,&lt;br /&gt;
зарегистрированых на машине. Нужно найти компоненты (Это компоненты от MS и они помечены (OLEDB)) и вставить их в диалог. Для того что бы иметь возможность управлять ими, нужно импортировать обертки для них, это делается при помощи ClassWisard, там есть импорт-&amp;gt;класс-&amp;gt;указать файл с компоентой (OSX).&lt;br /&gt;
Появляется список всех классов, объявленых внутри.&lt;br /&gt;
Проставляем галочки, нажимаем ОК.&lt;br /&gt;
&lt;br /&gt;
[[Category:FAQ]]&lt;/div&gt;</summary>
		<author><name>Mczim</name></author>	</entry>

	<entry>
		<id>https://wiki.shelek.ru/index.php?title=FAQ:WinAPI,_VCPP_Part_3&amp;diff=412</id>
		<title>FAQ:WinAPI, VCPP Part 3</title>
		<link rel="alternate" type="text/html" href="https://wiki.shelek.ru/index.php?title=FAQ:WinAPI,_VCPP_Part_3&amp;diff=412"/>
				<updated>2008-08-14T18:48:41Z</updated>
		
		<summary type="html">&lt;p&gt;Mczim: пробел перед знаком вопроса в заголовке&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Имеется приложение на основе CRichEditView. Как узнать, что пользователь меняет текст?===&lt;br /&gt;
Добавить обработчик сообщения EN_CHANGE. Сообщение генерируется CRichEditView каждый раз, когда пользователь изменяет текст в окне CRichEditView&lt;br /&gt;
===Чем метод CArray::GetSize отличается от метода CArray::GetCount?===&lt;br /&gt;
Абсолютно ничем. (Скорее всего, были предыдущие библиотеки, в которых функции, одинаковые по смыслу, имели разные имена. Поэтому в целях совместимости оставили оба)&lt;br /&gt;
===Как загрузить строку из ресурса?===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CString m_Temp;&lt;br /&gt;
m_Temp.LoadString(ID_MYSTRING);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как поменять иконку у элемента (item) в CListCtrl?===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//заполняем структуру LVITEM&lt;br /&gt;
LVITEM lvItem;&lt;br /&gt;
memset(&amp;amp;lvItem,0,sizeof(lvItem));&lt;br /&gt;
	&lt;br /&gt;
lvItem.mask = LVIF_IMAGE;//меняться будет картинка&lt;br /&gt;
lvItem.iItem = ...;// индекс элемента списка (Zero-based)&lt;br /&gt;
lvItem.iSubItem = 0;&lt;br /&gt;
lvItem.iImage = ...; //индекс иконки (из списка контрола)&lt;br /&gt;
	&lt;br /&gt;
pList-&amp;gt;SetItem(&amp;amp; lvItem);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Имеется класс Class1, содержащий мембер типа указатель на Class2. В Class2 также имеется указатель на Class1. Компилятор выдаёт ошибку. Что надо делать?===&lt;br /&gt;
Предварительно объявляем класс Class2. Тогда компилятору будет известно, что описание класса Class2 будет встречено дальше, и станет возможным объявление указателей на класс до описания самого класса.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Class2;//предопределение&lt;br /&gt;
	&lt;br /&gt;
Class1&lt;br /&gt;
{&lt;br /&gt;
	Class2* p;&lt;br /&gt;
};&lt;br /&gt;
	&lt;br /&gt;
Class2&lt;br /&gt;
{&lt;br /&gt;
	Class1* p;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как переключить раскладку в другом (то есть в активном) процессе?===&lt;br /&gt;
Использовать функции:&lt;br /&gt;
   GetKeyboardLayout - определить текущую раскладку&lt;br /&gt;
   LoadKeyboardLayout - загрузить новую раскладку&lt;br /&gt;
&lt;br /&gt;
см.также&lt;br /&gt;
   VerLanguageName - получить строку с описанием языка&lt;br /&gt;
&lt;br /&gt;
(подробности - в MSDN)&lt;br /&gt;
===Как получить хендл контрола Edit зная его ID?===&lt;br /&gt;
Пусть контрол лежит на окне CMyWnd&lt;br /&gt;
Тогда:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void CMyWnd::некая_процедура()&lt;br /&gt;
{&lt;br /&gt;
	//для MFC&lt;br /&gt;
	CEdit* ed=(CEdit* ) GetDlgItem(ID_EDIT1);&lt;br /&gt;
	HWND hwnd=ed-&amp;gt;GetSafeHwnd();&lt;br /&gt;
	...&lt;br /&gt;
	&lt;br /&gt;
	//для Win32 API&lt;br /&gt;
	HWND hwnd=GetDlgItem(m_hWnd,ID_EDIT1);&lt;br /&gt;
	...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Как из дочернего окна закрыть приложение?===&lt;br /&gt;
Нужно послать родительскому окну (*pParent) сообщение WM_CLOSE:&lt;br /&gt;
 pParent-&amp;gt;PostMessage(WM_CLOSE);//MFC&lt;br /&gt;
или&lt;br /&gt;
 ::PostMessage(pParent-&amp;gt;m_hWnd,WM_CLOSE,(WPARAM)0,(LPARAM)0);//API&lt;br /&gt;
===Как корректно перевести BSTR в CString и наоборот?===&lt;br /&gt;
Нужно просто присвоить переменной типа CString переменную типа BSTR.&lt;br /&gt;
Оператор = класса CString сам всё переведёт.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//указатель на будущий буфер с BSTR.&lt;br /&gt;
//	(По сути, BSTR определён как &lt;br /&gt;
//	typedef WCHAR* BSTR;&lt;br /&gt;
//	то есть указатель на 16-битный символ юникод)&lt;br /&gt;
	&lt;br /&gt;
BSTR bstrHE=0;&lt;br /&gt;
	&lt;br /&gt;
CString Str=&amp;quot;мой текст&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
//Выделить память и загрузить адрес блока в bstrHE&lt;br /&gt;
bstrHE=Str.AllocSysString();&lt;br /&gt;
	&lt;br /&gt;
//...	&lt;br /&gt;
//тут работаем с bstrHE[]&lt;br /&gt;
//...&lt;br /&gt;
	&lt;br /&gt;
//освобождаем память&lt;br /&gt;
SysFreeString(bstrHE);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Как получить доступ к графическим ресурсам элементов текущей темы оформления Windows?===&lt;br /&gt;
Использовать функции&lt;br /&gt;
&lt;br /&gt;
OpenThemeData()&lt;br /&gt;
DrawThemeBackground()&lt;br /&gt;
DrawFrameControl()&lt;br /&gt;
CloseThemeData().&lt;br /&gt;
&lt;br /&gt;
(подробности - в MSDN)&lt;br /&gt;
===Имеется класс , производный от CDialog. Когда диалог в фокусе, нажатие на Enter или Esc приводит к закрытию диалога. Как это запретить?===&lt;br /&gt;
При нажатии Enter происходит выполнение команды IDOK,&lt;br /&gt;
при нажатии Esc - IDCANCEL.&lt;br /&gt;
Нужно переопределить в классе виртуальные функции OnOk() и OnCancel(),&lt;br /&gt;
которые соответственно вызываются для этих команд. При помощи&lt;br /&gt;
визарда эти функции добавить можно так: Положить на диалог две кнопки&lt;br /&gt;
с идентификаторами IDOK и IDCANCEL (при создании нового диалога они там&lt;br /&gt;
есть сразу), затем двойной клик по кнопке добавляет соответствующий&lt;br /&gt;
обработчик. В обработчиках надо удалить вызовы СDialog::OnOK() и&lt;br /&gt;
CDialog::OnCancel(), тогда диалог закрываться не будет.&lt;br /&gt;
Однако тогда диалог станет невозможно закрыть кнопкой с крестиком  :)&lt;br /&gt;
&lt;br /&gt;
Лечить так: добавить обработчик сообщения WM_CLOSE - OnClose(), и в нём&lt;br /&gt;
сделать вызов OnOk() или OnCancel() :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void CPlayersPropsDialog::OnClose() &lt;br /&gt;
{&lt;br /&gt;
	CDialog::OnClose();&lt;br /&gt;
	CDialog::OnCancel();//добавлено&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===VC++6. Я написал простейший макрос, а компилятор на него ругается. Ума не приложу, что за глюк?===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	#define my_macr(x,y,z) \&lt;br /&gt;
		z=\&lt;br /&gt;
		(x+y)*\&lt;br /&gt;
		(x-y)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Скорее всего после одного из символов соединения строк &amp;quot;\&amp;quot; имеется&lt;br /&gt;
пробел или табуляция. Их надо удалить. Можно найти их &amp;quot;наощупь&amp;quot;, а&lt;br /&gt;
можно включить показ непечатных символов в студии. Найти эту команду&lt;br /&gt;
можно так:&lt;br /&gt;
Tools-&amp;gt;Customize...-&amp;gt;вкладка Commands. В окошке Category выбрать&lt;br /&gt;
&amp;quot;Edit&amp;quot;, и среди кнопок справа найти кнопку, на которой написано &amp;quot;a.b&amp;quot;&lt;br /&gt;
Эту кнопку надо перетащить на одну из панелей инструментов студии.&lt;br /&gt;
&lt;br /&gt;
===Как получить список всех процесов, включая idle?===&lt;br /&gt;
Использовать функции&lt;br /&gt;
Process32First()&lt;br /&gt;
Precess32Next()&lt;br /&gt;
&lt;br /&gt;
===Как программно установить переменные окружения?===&lt;br /&gt;
Чтобы добавить или изменить их программно, необходимо воспользоваться&lt;br /&gt;
ключом реестра HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\&lt;br /&gt;
Session Manager\Environment, а затем отправить широковещательное&lt;br /&gt;
сообщение WM_SETTINGCHANGE. Это позволит приложениям узнать об&lt;br /&gt;
изменениях:&lt;br /&gt;
&lt;br /&gt;
::SendMessage(HWND_BROADCAST,WM_SETTINGCHANGE,0,0);&lt;br /&gt;
===Как сделать, чтобы у окна был черный фон?===&lt;br /&gt;
переопределить обработчик сообщения WM_CTLCOLOR - OnCtlColor() :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CBrush br(RGB(0,0,0));&lt;br /&gt;
	&lt;br /&gt;
HBRUSH CMyDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) &lt;br /&gt;
{&lt;br /&gt;
	HBRUSH hbr = CMyDlg::OnCtlColor(pDC, pWnd, nCtlColor);&lt;br /&gt;
	&lt;br /&gt;
	//фон диалога (или вьюшки)&lt;br /&gt;
	if(nCtlColor==CTLCOLOR_DLG)&lt;br /&gt;
	{&lt;br /&gt;
		return (HBRUSH)br;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	//фон статиков (если нужно)&lt;br /&gt;
	if(nCtlColor==CTLCOLOR_STATIC)&lt;br /&gt;
	{&lt;br /&gt;
		//делаем фон текста статика прозрачным&lt;br /&gt;
		pDC-&amp;gt;SetBkMode(TRANSPARENT);&lt;br /&gt;
		return (HBRUSH)br;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	return hbr;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Почему на моем компьютере экзешник, созданный в MFC запускается, а на других компьютерах - нет? Требует какую-то  dll-ку.===&lt;br /&gt;
Нужно выбирать режим Release :&lt;br /&gt;
&lt;br /&gt;
Menu-&amp;gt;Build-&amp;gt;Configurations...-&amp;gt;Release,&lt;br /&gt;
&lt;br /&gt;
и экзешник, соответственно, брать из папки Release проекта&lt;br /&gt;
===Как в диалог добавить меню?===&lt;br /&gt;
Надо сделать в ресурсах меню, затем вставить в диалог:&lt;br /&gt;
&lt;br /&gt;
открыть в редакторе диалог, в свойствах (во вкладке General, окошко Menu) указать идентивикатор ресурса меню.&lt;br /&gt;
При помощи визарда добавить для меню обработчики OnCommand() и OnUpdateСommand().&lt;br /&gt;
===Я добавил визардом меню в диалог. Добавил обработчики для пунктов меню. Пункты работают, но OnUpdate для пунктов не вызывается - то есть не получается ни затенить, ни чек поставить. Что делать?===&lt;br /&gt;
В диалоге у меню апдейта не происходит сам, в отличие от мейнфрейма.&lt;br /&gt;
Для этого нужно сделать самим апдейт в обработчике сообщения WM_KICKIDLE.&lt;br /&gt;
Визардом обработчик не добавляется, поэтому можно переопределить виртуальную DefWindowProc() и там обработать:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;afxpriv.h&amp;gt;	//этот файл надо включить, там определёна WM_KICKIDLE&lt;br /&gt;
&lt;br /&gt;
LRESULT CMyDialog::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam) &lt;br /&gt;
{&lt;br /&gt;
	if(message==WM_KICKIDLE)&lt;br /&gt;
	{&lt;br /&gt;
		//делаем апдейт для всех пунктов меню&lt;br /&gt;
		CMenu* pMainMenu=GetMenu();&lt;br /&gt;
		if(pMainMenu)&lt;br /&gt;
		{&lt;br /&gt;
			CCmdUI cmdUI;&lt;br /&gt;
			for (UINT n=0; n &amp;lt; pMainMenu-&amp;gt;GetMenuItemCount(); ++n)&lt;br /&gt;
			{&lt;br /&gt;
				CMenu* pSubMenu = pMainMenu-&amp;gt;GetSubMenu(n);&lt;br /&gt;
				if(!pSubMenu)continue;&lt;br /&gt;
	&lt;br /&gt;
				cmdUI.m_nIndexMax = pSubMenu-&amp;gt;GetMenuItemCount();&lt;br /&gt;
				for (UINT i = 0; i &amp;lt; cmdUI.m_nIndexMax;++i)&lt;br /&gt;
				{&lt;br /&gt;
					cmdUI.m_nIndex = i;&lt;br /&gt;
					cmdUI.m_nID = pSubMenu-&amp;gt;GetMenuItemID(i);&lt;br /&gt;
					cmdUI.m_pMenu = pSubMenu;&lt;br /&gt;
					cmdUI.DoUpdate(this, FALSE);&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	return CDialog::DefWindowProc(message, wParam, lParam);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Как на Visual C++ 6.0 в Главном окне отключить системное меню (в левом верхнем углу) и кнопки(в правом верхнем углу)?===&lt;br /&gt;
При создании окна нужно убрать стиль WS_SYSMENU&lt;br /&gt;
(теперь пользователь корректно может закрыть окно только Alt+F4,&lt;br /&gt;
ну или если вы предоставите ему дополнительную возможность сделать это)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пример 1. (для SDI, MDI)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//этот обработчик уже добавлен визардом&lt;br /&gt;
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT&amp;amp; cs)&lt;br /&gt;
{&lt;br /&gt;
	if( !CFrameWnd::PreCreateWindow(cs) )&lt;br /&gt;
		return FALSE;&lt;br /&gt;
	// TODO: Modify the Window class or styles here by modifying&lt;br /&gt;
	//  the CREATESTRUCT cs&lt;br /&gt;
&lt;br /&gt;
	///////////////////////////////&lt;br /&gt;
	//добавленная часть&lt;br /&gt;
	{&lt;br /&gt;
		//убираем стиль&lt;br /&gt;
		cs.style&amp;amp;=~WS_SYSMENU;&lt;br /&gt;
	}&lt;br /&gt;
	///////////////////////////////&lt;br /&gt;
&lt;br /&gt;
	return TRUE;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Пример 2. (для диалога)&lt;br /&gt;
Если диалог описан в ресурсах, то в свойствах диалога убрать галочки&lt;br /&gt;
  &amp;quot;System menu&amp;quot;&lt;br /&gt;
  &amp;quot;Minimize box&amp;quot;&lt;br /&gt;
  &amp;quot;Maximize box&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===Хочу сделать так, чтобы пользователь не мог нажать на кнопку, пока программа не разрешит.===&lt;br /&gt;
Нужно применить метод класса CWnd::EnableWindow(...) для кнопки.&lt;br /&gt;
Значение параметра 0 делает кнопку неактивной, 1 - делает активной.&lt;br /&gt;
(кстате, не только для кнопки можно, а для любого класса, производного&lt;br /&gt;
от класса CWnd)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пусть имеется некий диалог, на нём лежит кнопка c ID == IDC_1.&lt;br /&gt;
в любом месте кода диалога (кроме конструктора и деструктора , хотя, если&lt;br /&gt;
проверить наличие валидного хендла диалога, как в примере, то ничего&lt;br /&gt;
страшного не будет и там)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//делаем кнопку неактивной&lt;br /&gt;
if(m_hWnd)&lt;br /&gt;
{&lt;br /&gt;
	CWnd* pw=0;&lt;br /&gt;
	pw=GetDlgItem(IDC_1);&lt;br /&gt;
	if(pw)pw-&amp;gt;EnableWindow(0);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Что означают сообщения, которые студия выводит при компиляции, вроде таких : Loaded 'C:\WINDOWS\SYSTEM\WSOCK32.DLL', no matching symbolic information found. ===&lt;br /&gt;
Это строка говорит о том, что студия не смогла найти отладочные&lt;br /&gt;
символы для WSOCK32.DLL. В этом нет ничего страшного, просто при наличии&lt;br /&gt;
отладочных символов в процессе отладки можно получить доступ к именам&lt;br /&gt;
функции из системных DLL. Например, вместо&lt;br /&gt;
 KERNEL32! 0x77E8B184() -&lt;br /&gt;
 увидим&lt;br /&gt;
 KERNEL32!CreateThread.&lt;br /&gt;
===Как обработать сообщения , которое приходит к некому контролу (скажем CEdit)?===&lt;br /&gt;
Нужно произвести от CEdit свой класс, и в виртуальной процедуре класса WindowProc перехватить нужные сообщения.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
virtual LRESULT WindowProc(&lt;br /&gt;
   UINT message,&lt;br /&gt;
   WPARAM wParam,&lt;br /&gt;
   LPARAM lParam &lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Пример. Полностью выключаем, скажем, обработку сообщения WM_CHAR&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	LRESULT CMyEdit::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) &lt;br /&gt;
	{&lt;br /&gt;
		switch(message)&lt;br /&gt;
		{&lt;br /&gt;
			case WM_CHAR:&lt;br /&gt;
			{&lt;br /&gt;
				return 0;&lt;br /&gt;
			}&lt;br /&gt;
			break;&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		return CEdit::WindowProc(message, wParam, lParam);&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Чтобы связать экземпляр класса с контролом на форме, добавьте визардом для&lt;br /&gt;
контрола переменную класса (выбрав не Value а Control).&lt;br /&gt;
&lt;br /&gt;
===Как настроить количество пробелов в табуляции?===&lt;br /&gt;
Tools-&amp;gt;Options-&amp;gt;Tabs-&amp;gt;Insert Spaces&lt;br /&gt;
(или  правой кнопкой мыши по тексту-&amp;gt; properties)&lt;br /&gt;
===Как автоматически расставить отступы?===&lt;br /&gt;
Выделить текст для форматирования, нажать Alt+F8&lt;br /&gt;
&lt;br /&gt;
Есть ещё программа Artistic Style, которая занимается&lt;br /&gt;
переформатированием кода&lt;br /&gt;
http://sourceforge.net/projects/astyle/&lt;br /&gt;
===Поиск границ блока===&lt;br /&gt;
&amp;quot;CTRL+ }&amp;quot; ищет парную фигурную скобку в тексте и переходит на неё&lt;br /&gt;
===Вертикальное выделение текста===&lt;br /&gt;
&amp;quot;Alt + выделение мышкой&amp;quot; - позволяет выделять вертикальные фрагменты текста&lt;br /&gt;
===Как узнать количество установленных в CListCtrl столбцов ?===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CListCtrl* pL=...; //указатель на переменную-контрол&lt;br /&gt;
&lt;br /&gt;
int count=pL-&amp;gt;GetHeaderCtrl()-&amp;gt;GetItemCount();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как получить иконку приложения?===&lt;br /&gt;
Если приложение запущено, то нужно найти его главное окно и&lt;br /&gt;
послать ему сообщение WM_GETICON.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//функция возвращант хендл иконки &lt;br /&gt;
LRESULT SendMessage(hWnd, WM_GETICON, wParam, 0);&lt;br /&gt;
&lt;br /&gt;
//hWnd == хендл окна приложения&lt;br /&gt;
//wParam == &lt;br /&gt;
//	1)==ICON_BIG - получить большую иконку&lt;br /&gt;
//	2)==ICON_SMALL - получить маленькую иконку&lt;br /&gt;
//	3)==ICON_SMALL2 - получить маленькую иконку, если она определена&lt;br /&gt;
//				в приложении. Если её нет, то маленькую иконку, &lt;br /&gt;
//				сгенерированную системой из большой иконки&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как в CString можно найти или вырезать часть строки?===&lt;br /&gt;
есть такие методы в CString :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//вырезает кусок строки&lt;br /&gt;
CString Mid(int nFirst) const;&lt;br /&gt;
CString Mid(int nFirst,  int nCount) const;&lt;br /&gt;
&lt;br /&gt;
//возвращает кусок строки (сначала или с конца)&lt;br /&gt;
CString Left(int nCount ) const;&lt;br /&gt;
CString Right(int nCount ) const;&lt;br /&gt;
&lt;br /&gt;
//возвращает начальный кусок строки, в котором есть только&lt;br /&gt;
//символы из набора,представленного в lpszCharSet&lt;br /&gt;
CString SpanIncluding(LPCTSTR lpszCharSet ) const;&lt;br /&gt;
&lt;br /&gt;
//возвращает начальный кусок строки, в котором нет&lt;br /&gt;
//символов из набора,представленного в lpszCharSet&lt;br /&gt;
CString SpanExcluding(LPCTSTR lpszCharSet ) const; &lt;br /&gt;
&lt;br /&gt;
//убирает &amp;quot;пробелоподобные&amp;quot; символы из самого начала строки&lt;br /&gt;
//(то есть - пробел, табуляцию (\t) , возврат каретки, перевод строки (/r/n))&lt;br /&gt;
void TrimLeft();&lt;br /&gt;
//убирает все повторы символа из самого начала строки&lt;br /&gt;
void TrimLeft(TCHAR chTarget );&lt;br /&gt;
//убирает из самого начала строки все символа из набора lpszTargets &lt;br /&gt;
void TrimLeft(LPCTSTR lpszTargets ); &lt;br /&gt;
&lt;br /&gt;
void TrimRight();&lt;br /&gt;
void TrimRight(TCHAR chTarget );&lt;br /&gt;
void TrimRight(LPCTSTR lpszTargets ); &lt;br /&gt;
&lt;br /&gt;
//поиск в строке&lt;br /&gt;
int Find( TCHAR ch ) const;&lt;br /&gt;
int Find( LPCTSTR lpszSub ) const;&lt;br /&gt;
int Find( TCHAR ch, int nStart ) const;&lt;br /&gt;
int Find( LPCTSTR pstr, int nStart ) const;&lt;br /&gt;
&lt;br /&gt;
//поиск, начиная с конца&lt;br /&gt;
int ReverseFind( TCHAR ch ) const;&lt;br /&gt;
&lt;br /&gt;
//поиск позиции первого символа, одного из набора,&lt;br /&gt;
// представленного в lpszCharSet&lt;br /&gt;
int FindOneOf( LPCTSTR lpszCharSet ) const;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Есть у меня CListBox и я в ходе выполнения программы добавляю в него строки. Но я не могу посмотреть что именно добавляется. Вывод результатов происходит в конце выполнения процедуры...===&lt;br /&gt;
Если нужно делать принудительную перерисовку окна во время&lt;br /&gt;
длительных вычислений, то нужно вызывать для окна, которое&lt;br /&gt;
надо перерисовать метод&lt;br /&gt;
  RedrawWindow()&lt;br /&gt;
с параметрами по умолчанию, или пару&lt;br /&gt;
  Invalidate(0);&lt;br /&gt;
  UpdateWindow();&lt;br /&gt;
Это приводит к пометке всего окна к перерисовке и отправлению&lt;br /&gt;
сообщения WM_PAINT в оконную процедуру в обход очереди&lt;br /&gt;
сообщений, вызывая немедленную перерисовку окна.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CWnd* pw=...;//окно , которое надо перерисовывать&lt;br /&gt;
&lt;br /&gt;
for(int i=0;i&amp;lt;10000)&lt;br /&gt;
{&lt;br /&gt;
	//меняется содержимое окна&lt;br /&gt;
	//...&lt;br /&gt;
&lt;br /&gt;
	//немедленная перерисовка&lt;br /&gt;
	pw-&amp;gt;Invalidate(0);&lt;br /&gt;
	pw-&amp;gt;UpdateWindow();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Я написал DLL , которую используют несколько приложений. Всё вроде работает, но когда происходит очередной вызов функции из DLL , почему то данные в функции обнуляются. С чем это связано ?===&lt;br /&gt;
Переменные и массивы в DLL, содержимое которых должно использоваться несколькими процессами, должны объявляться статическими. Статическая переменная или массив инициализируются только один раз в момент загрузки DLL.&lt;br /&gt;
Пример:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DWORD calltest()&lt;br /&gt;
{&lt;br /&gt;
	//будет выполнено только при первом вызове&lt;br /&gt;
	static DWORD callcount=0;&lt;br /&gt;
	static DWORD str[1000]={0}; &lt;br /&gt;
&lt;br /&gt;
	//будет выполняться каждый раз&lt;br /&gt;
	return ++callcount;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как открыть проекцию файла в память и как с ней работать?===&lt;br /&gt;
Как открыть проекцию файла в память и как с ней работать?&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HANDLE CreateFileMapping(&lt;br /&gt;
  HANDLE hFile,	//хендл уже открытого файла&lt;br /&gt;
  LPSECURITY_ATTRIBUTES lpAttributes,&lt;br /&gt;
  DWORD flProtect,	//способ открытия проекции&lt;br /&gt;
  DWORD dwMaximumSizeHigh,	//размер файла (старшие 4 байта , обычно==0)&lt;br /&gt;
  DWORD dwMaximumSizeLow,	//размер файла (младшие 4 байта)&lt;br /&gt;
  LPCTSTR lpName&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Доступ к созданной проекции производится процедурой&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LPVOID MapViewOfFile(&lt;br /&gt;
  HANDLE hFileMappingObject, //хендл проекции&lt;br /&gt;
  DWORD dwDesiredAccess,	//способ работы с проекцией&lt;br /&gt;
  DWORD dwFileOffsetHigh,&lt;br /&gt;
  DWORD dwFileOffsetLow, //смещение от начала файла (младшие 4 байта)&lt;br /&gt;
  SIZE_T dwNumberOfBytesToMap //длина в байтах (если ==0 - то весь файл)&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
далее с файлом можно работать как с обычным массивом в памяти.&lt;br /&gt;
&lt;br /&gt;
После работы с проекцией , её надо освободить процедурой&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
BOOL UnmapViewOfFile(&lt;br /&gt;
  LPCVOID lpBaseAddress //адрес, который вернула процедура MapViewOfFile&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Пример.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HANDLE hMapFile=0;//для проекции&lt;br /&gt;
&lt;br /&gt;
HANDLE hFile=...;//хендл уже открытого файла&lt;br /&gt;
DWORD dwdFileLen=...;//размер открытого файла&lt;br /&gt;
&lt;br /&gt;
//создаём проекцию &amp;quot;только для чтения&amp;quot;&lt;br /&gt;
hMapFile=::CreateFileMapping(hFile,0,PAGE_READONLY,0,dwdFileLen,0);&lt;br /&gt;
&lt;br /&gt;
//хендл hFile можно закрыть уже здесь, в принципе,&lt;br /&gt;
//но мы сделаем это позже&lt;br /&gt;
&lt;br /&gt;
//получаем доступ к проекции (тоже только для чтения)&lt;br /&gt;
BYTE* pbyFile=(BYTE*)::MapViewOfFile(hMapFile,FILE_MAP_READ,0,0,0);&lt;br /&gt;
&lt;br /&gt;
///////////////////&lt;br /&gt;
//тут работаем с массивом pbyFile[dwdFileLen] как с обычным,&lt;br /&gt;
//только не забываем, что он открыт только для чтения&lt;br /&gt;
//...&lt;br /&gt;
//...&lt;br /&gt;
//...&lt;br /&gt;
///////////////////&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//отключаем файл данных от адресного пространства&lt;br /&gt;
UnmapViewOfFile(pbyFile);&lt;br /&gt;
&lt;br /&gt;
//освобождаем хендл проекции&lt;br /&gt;
CloseHandle(hMapFile)&lt;br /&gt;
&lt;br /&gt;
//освобождаем хендл открытого файла&lt;br /&gt;
CloseHandle(hFile);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Использую MFC Grid control 2.25 , не получается отобразить картинку в ячейке. Как это делается ?===&lt;br /&gt;
Нужно создать список изображений (CImageList) , затем передать указатель на список в контрол. Поскольку контрол лишь копирует указатель , список должен создаваться динамически, либо быть членом класса, экземпляр которого существует всё время работы контрола.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 m_GridMarket&lt;br /&gt;
CImageList m_ImageList;&lt;br /&gt;
CGridCtrL m_Grid1&lt;br /&gt;
...&lt;br /&gt;
...&lt;br /&gt;
//неким образом создаётся список&lt;br /&gt;
m_ImageList.Create(...);&lt;br /&gt;
//...&lt;br /&gt;
&lt;br /&gt;
//вставляем в контрол&lt;br /&gt;
m_Grid1.SetImageList(&amp;amp;m_ImageList);&lt;br /&gt;
&lt;br /&gt;
//&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как при помощи IPicture отобразить картинку из файла? ===&lt;br /&gt;
Пример - несложная функция, отображающая картинку из файла&lt;br /&gt;
&lt;br /&gt;
поддерживаются форматы&lt;br /&gt;
BMP, GIF, JPEG, PNG, TIFF, EMF&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;quot;atlconv.h&amp;quot;&lt;br /&gt;
#define HandleIsValid(H) (H!=(HANDLE)-1 &amp;amp;&amp;amp; H!=(HANDLE)0)&lt;br /&gt;
&lt;br /&gt;
//*pDestDC - CDC, на который предполагается вывод картинки&lt;br /&gt;
//pchzFilePath - путь к файлу&lt;br /&gt;
//pWid - (возвращает) ширина картинки&lt;br /&gt;
//pHig - (возвращает) высота картинки&lt;br /&gt;
bool DrawBitmapFromFile(CDC* pDestDC,const char* pchzFilePath,int *pWid=0,int *pHig=0)&lt;br /&gt;
{&lt;br /&gt;
	bool result=false;&lt;br /&gt;
&lt;br /&gt;
	if(pWid)*pWid=0;&lt;br /&gt;
	if(pHig)*pHig=0;&lt;br /&gt;
&lt;br /&gt;
	int Wid=0;&lt;br /&gt;
	int Hig=0;&lt;br /&gt;
&lt;br /&gt;
	IPicture* pPic=0;&lt;br /&gt;
	try&lt;br /&gt;
	{&lt;br /&gt;
		IPicture* ptmpPic=0;&lt;br /&gt;
		USES_CONVERSION;&lt;br /&gt;
		HRESULT hr;&lt;br /&gt;
&lt;br /&gt;
		CString txt=pchzFilePath;&lt;br /&gt;
		hr= ::OleLoadPicturePath(&lt;br /&gt;
			const_cast&amp;lt;LPOLESTR&amp;gt;(T2COLE(txt)),&lt;br /&gt;
			0,0,0,IID_IPicture,&lt;br /&gt;
			reinterpret_cast&amp;lt;void **&amp;gt;(&amp;amp;ptmpPic)&lt;br /&gt;
			);&lt;br /&gt;
&lt;br /&gt;
		if(hr==S_OK &amp;amp;&amp;amp; ptmpPic)&lt;br /&gt;
		{&lt;br /&gt;
			pPic=ptmpPic;&lt;br /&gt;
		}&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			throw 0;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		OLE_XPOS_HIMETRIC cxSrc;&lt;br /&gt;
		OLE_YPOS_HIMETRIC cySrc;&lt;br /&gt;
&lt;br /&gt;
		if(S_OK!=pPic-&amp;gt;get_Width(&amp;amp;cxSrc))throw 0;&lt;br /&gt;
		if(S_OK!=pPic-&amp;gt;get_Height(&amp;amp;cySrc))throw 0;&lt;br /&gt;
&lt;br /&gt;
		Wid=cxSrc/26;&lt;br /&gt;
		Hig=cySrc/26;&lt;br /&gt;
&lt;br /&gt;
		//рисуем&lt;br /&gt;
		if(S_OK !=pPic-&amp;gt;Render(pDestDC-&amp;gt;GetSafeHdc(),&lt;br /&gt;
			0,Hig,Wid,-Hig,0,0,cxSrc,cySrc,0))throw 0;&lt;br /&gt;
	}&lt;br /&gt;
	catch(...)&lt;br /&gt;
	{&lt;br /&gt;
		result=false;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if(pPic)&lt;br /&gt;
	{&lt;br /&gt;
		pPic-&amp;gt;Release();&lt;br /&gt;
		pPic=0;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	if(pWid)*pWid=Wid;&lt;br /&gt;
	if(pHig)*pHig=Hig;&lt;br /&gt;
&lt;br /&gt;
	return result;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===У меня модальное диалоговое окно, в нем поле редактирования мультилайновое, т.е. чтобы перейти на новую строку надо нажать ентер, но вызывается стандартный обработчик диалогового окна. Подскажите, что делать?===&lt;br /&gt;
Нужно в редакторе ресурсов поставить для CEdit окошка галочку&lt;br /&gt;
свойства WantReturn,&lt;br /&gt;
&lt;br /&gt;
или добавить ES_WANTRETURN при создании CEdit контрола динамически.&lt;br /&gt;
===Как выводят картинку-логотип(splash screen) при запуске программы? То есть, когда загружается программа на экран выводится картинка, потом она исчезает(загрузка программы закончена) и пользователь может приступать к работе ===&lt;br /&gt;
Для этого используется класс, производный от CDialog. Этот диалог после создания показывает себя на экран, выводя на себя рисунок. Также запускает таймет, по срабатывани которого диалог гасится. Создаётся диалог InitInstance приложения.&lt;br /&gt;
&lt;br /&gt;
В VC6++ также есть уже готовый компонент&lt;br /&gt;
Project-&amp;gt;Add To Project -&amp;gt; Components and Controls-&amp;gt;(в папке &amp;quot;Visual C++ Components&amp;quot; есть SplashScreen.)&lt;br /&gt;
===Как сделать, чтобы при выпадении списка у ComboBox была не одна строка, а больше, вроде все свойства покрутил, не помогает Вместо выпадающего списка одна строка и скролл...===&lt;br /&gt;
В редакторе ресурсов надо щелкнуть в комбобоксе на треугольнике - появляется рамка для растягивания вниз - размер выпадающего списка.&lt;br /&gt;
===В VC++.net , что делать после того, как на форму установил ActiiveX ListView, как объявить класс и переменную для этого элемента?===&lt;br /&gt;
Щёлкнуть правой кнопкой мыши на элементе , в меню - add variable или add class&lt;br /&gt;
===Как вставить данные в буфер обмена (Clipboard) ? Как их оттуда вытащить ?===&lt;br /&gt;
&lt;br /&gt;
1) копирование в буфер обмена:&lt;br /&gt;
&lt;br /&gt;
  1.Готовим данные&lt;br /&gt;
    а.Выделяем память из кучи,  вызывая GlobalAlloc()&lt;br /&gt;
    б.Получаем указатель на выделенную память, вызывая GlobalLock()&lt;br /&gt;
    в.Заполняем данные&lt;br /&gt;
    г.Освобождаем указатель , вызывая GlobalUnlock();&lt;br /&gt;
&lt;br /&gt;
  2.Открываем буфер обмена , вызывая OpenClipboard();&lt;br /&gt;
  3.Очищаем буфер, вызывая EmptyClipboard();&lt;br /&gt;
  4.Вызываем SetClipboardData() один раз для каждого формата&lt;br /&gt;
      вставляемых данных (имеется в виду - если одни и те же&lt;br /&gt;
      данные представлены в разных форматах, и приложение&lt;br /&gt;
      может эти форматы создать)&lt;br /&gt;
  5.Закрываем буфер, вызывая CloseClipboard();&lt;br /&gt;
  6.ВЫЗЫВАТЬ GlobalFree() НЕ НУЖНО , в этом случае это&lt;br /&gt;
      предоставлено системе&lt;br /&gt;
&lt;br /&gt;
Скажем, хотим поместить в буфер обмена туда текст.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	//готовим данные&lt;br /&gt;
	//выделяем из кучи память для данных&lt;br /&gt;
	HANDLE hglbCopy = GlobalAlloc(GMEM_MOVEABLE,10);&lt;br /&gt;
	if(!hglbCopy)return;&lt;br /&gt;
&lt;br /&gt;
	//получаем указатель&lt;br /&gt;
	void* lpStr = GlobalLock(hglbCopy);&lt;br /&gt;
	if(!lpStr)return;&lt;br /&gt;
&lt;br /&gt;
	//заполняем данные&lt;br /&gt;
	strcpy((char*)lpStr,&amp;quot;my text&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	//освобождаем указатель&lt;br /&gt;
	GlobalUnlock(hglbCopy);&lt;br /&gt;
	lpStr=0;&lt;br /&gt;
&lt;br /&gt;
	//открываем буфер обмена&lt;br /&gt;
	OpenClipboard();&lt;br /&gt;
	//очищаем&lt;br /&gt;
	EmptyClipboard();&lt;br /&gt;
&lt;br /&gt;
	//текстовый формат&lt;br /&gt;
	SetClipboardData(CF_TEXT,hglbCopy);&lt;br /&gt;
&lt;br /&gt;
	//закрываем буфер&lt;br /&gt;
	CloseClipboard();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
2) извлечение из буфера обмена&lt;br /&gt;
&lt;br /&gt;
  1.Проверяем, что поддерживается нужный формат данных,&lt;br /&gt;
      вызывая IsClipboardFormatAvailable()&lt;br /&gt;
  2.Открываем буфер обмена , вызывая OpenClipboard();&lt;br /&gt;
  3.Достаём данные&lt;br /&gt;
   а.Получаем из буфера хендл требуемого формата,&lt;br /&gt;
      вызывая GetClipboardData()&lt;br /&gt;
    б.Получаем указатель на выделенную память, вызывая GlobalLock()&lt;br /&gt;
    в.Работаем с данными&lt;br /&gt;
    г.Освобождаем указатель , вызывая GlobalUnlock();&lt;br /&gt;
  4.Закрываем буфер, вызывая CloseClipboard();&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	//Проверяем, что поддерживается нужный формат данных,&lt;br /&gt;
	if(!IsClipboardFormatAvailable(CF_TEXT))return;&lt;br /&gt;
&lt;br /&gt;
	//открываем буфер обмена&lt;br /&gt;
	OpenClipboard();&lt;br /&gt;
&lt;br /&gt;
	//достаём данные&lt;br /&gt;
&lt;br /&gt;
	//текстовый формат&lt;br /&gt;
	HANDLE hglbCopy = GetClipboardData(CF_TEXT);&lt;br /&gt;
	if(!hglbCopy)return;&lt;br /&gt;
&lt;br /&gt;
	//получаем указатель&lt;br /&gt;
	void* lpStr = GlobalLock(hglbCopy);&lt;br /&gt;
	if(!lpStr)return;&lt;br /&gt;
&lt;br /&gt;
	//читаем данные&lt;br /&gt;
	char data[10];&lt;br /&gt;
	memmove(data,lpStr,sizeof(data));&lt;br /&gt;
&lt;br /&gt;
	//освобождаем указатель&lt;br /&gt;
	GlobalUnlock(hglbCopy);&lt;br /&gt;
	lpStr=0;&lt;br /&gt;
&lt;br /&gt;
	//закрываем буфер&lt;br /&gt;
	CloseClipboard();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как получить полный путь к экзешнику из самой программы ?===&lt;br /&gt;
В командную строку первым параметром система всегда передаёт заключённый в кавычки полный путь к файлу запущенной программы Достаём путь таким образом :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
BOOL CMyApp::InitInstance()&lt;br /&gt;
{&lt;br /&gt;
	//добыча полного имени экзешника&lt;br /&gt;
	CString csFullExeName;&lt;br /&gt;
	{&lt;br /&gt;
		CString csAppName=GetCommandLine();&lt;br /&gt;
		csAppName.Delete(0,1);&lt;br /&gt;
		csAppName.Replace('\&amp;quot;','\0');&lt;br /&gt;
		csFullExeName=(const char*)csAppName;&lt;br /&gt;
	}&lt;br /&gt;
	//теперь csFullExeName - содержит искомый путь&lt;br /&gt;
&lt;br /&gt;
	//...&lt;br /&gt;
	//...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Каким способом можно exe файл может заменить самого себя? То есть, моя программа обновляется, например, через Internet, и хочет обновить свой exe-файл. Но так как он в данный момент запущен - это будет, естественно, запрещено. Как это можно проще всего сделать?===&lt;br /&gt;
Один из способов - сделать копию экзешника и из него обновиться&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define def_exeNAMEup	&amp;quot;c:\\myprog_update.exe&amp;quot;&lt;br /&gt;
#define def_exeNAMEdnld	&amp;quot;c:\\myprog_downloaded.exe&amp;quot;&lt;br /&gt;
#define def_keyUdate	&amp;quot;/update&amp;quot;&lt;br /&gt;
&lt;br /&gt;
void CTESTFAQApp::UpdateItself()&lt;br /&gt;
{&lt;br /&gt;
	//добыча полного имени экзешника&lt;br /&gt;
	CString csFullExeName;&lt;br /&gt;
	{&lt;br /&gt;
		CString csAppName=GetCommandLine();&lt;br /&gt;
		csAppName.Delete(0,1);&lt;br /&gt;
		csAppName.Replace('\&amp;quot;','\0');&lt;br /&gt;
		csFullExeName=(const char*)csAppName;&lt;br /&gt;
	}&lt;br /&gt;
	//теперь csFullExeName - содержит искомый путь&lt;br /&gt;
&lt;br /&gt;
	//делаем копию экзешника с другим именем&lt;br /&gt;
	CopyFile(csFullExeName,def_exeNAMEup,0);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	//передаём в параметры нового процесса ключ и путь к текущему файлу&lt;br /&gt;
	CString csParams=def_keyUdate;&lt;br /&gt;
	csParams+=&amp;quot; &amp;quot;;&lt;br /&gt;
	csParams+=csFullExeName;&lt;br /&gt;
&lt;br /&gt;
	//запускаем копию&lt;br /&gt;
	STARTUPINFO si;&lt;br /&gt;
	PROCESS_INFORMATION pi;&lt;br /&gt;
	ZeroMemory(&amp;amp;si,sizeof(si));&lt;br /&gt;
	si.cb = sizeof(si);&lt;br /&gt;
	ZeroMemory(&amp;amp;pi,sizeof(pi));&lt;br /&gt;
	if(CreateProcess(def_exeNAMEup,def_keyUdate,0,0,0,0,0,0,&amp;amp;si,&amp;amp;pi))&lt;br /&gt;
	{&lt;br /&gt;
		//завершаем текущий процесс&lt;br /&gt;
		ExitFromMyApp();&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void CTESTFAQApp::ExitFromMyApp()&lt;br /&gt;
{&lt;br /&gt;
	exit(0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
BOOL CTESTFAQApp::InitInstance()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
	//смотрим, не запустили ли для апдейта?&lt;br /&gt;
&lt;br /&gt;
	CString txt;&lt;br /&gt;
	txt=m_lpCmdLine;&lt;br /&gt;
	if(txt.Find(def_keyUdate)==0)&lt;br /&gt;
	{&lt;br /&gt;
		//делаем айдейт&lt;br /&gt;
		txt.Replace(def_keyUdate,&amp;quot;&amp;quot;);&lt;br /&gt;
		txt.TrimLeft();&lt;br /&gt;
&lt;br /&gt;
		CString csFullExeName=txt;&lt;br /&gt;
&lt;br /&gt;
		//берём откуда то уже скачанный файл обновления&lt;br /&gt;
		//...&lt;br /&gt;
		CString csFull_Downloaded_ExeName=def_exeNAMEdnld;&lt;br /&gt;
&lt;br /&gt;
		//копируем файл (обновляем старый то есть)&lt;br /&gt;
		CopyFile(csFull_Downloaded_ExeName,csFullExeName,0);&lt;br /&gt;
&lt;br /&gt;
		//запускаем обновлённого мученника&lt;br /&gt;
		STARTUPINFO si;&lt;br /&gt;
		PROCESS_INFORMATION pi;&lt;br /&gt;
		ZeroMemory(&amp;amp;si,sizeof(si));&lt;br /&gt;
		si.cb = sizeof(si);&lt;br /&gt;
		ZeroMemory(&amp;amp;pi,sizeof(pi));&lt;br /&gt;
		if(CreateProcess(csFullExeName,0,0,0,0,0,0,0,&amp;amp;si,&amp;amp;pi))&lt;br /&gt;
&lt;br /&gt;
		ExitFromMyApp();&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
	//...&lt;br /&gt;
	//...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Есть строка символов (страничка из Инета) в кодировке utf-8 (строка char*). Как мне ее получить в формате String&lt;br /&gt;
или в char* в кодировке ANSI (cp 1251) ?===&lt;br /&gt;
Можно перевести строку из UTF8 в Unicode, затем из Unicode в 1251&lt;br /&gt;
&lt;br /&gt;
Ниже приведена структура, содержащая процедуры перекодирования,&lt;br /&gt;
а также процедуру с примером использования&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//описание структуры&lt;br /&gt;
struct coder&lt;br /&gt;
{&lt;br /&gt;
	//utf8-&amp;gt;unicode&lt;br /&gt;
	static wchar_t* utf8_to_unicode__dontForgetDeleteArr(const char *utf8_string)&lt;br /&gt;
	{&lt;br /&gt;
		wchar_t* pRes=0;&lt;br /&gt;
		int res_len=0;&lt;br /&gt;
&lt;br /&gt;
		//тест на возможность преобразования&lt;br /&gt;
		res_len=MultiByteToWideChar(CP_UTF8,0,utf8_string,-1,0,0);&lt;br /&gt;
		if(!res_len)return 0;&lt;br /&gt;
&lt;br /&gt;
		//выделяем память&lt;br /&gt;
		pRes = new wchar_t[res_len];&lt;br /&gt;
		if(!pRes)return 0;&lt;br /&gt;
&lt;br /&gt;
		//преобразование&lt;br /&gt;
		if(!MultiByteToWideChar(CP_UTF8,0,utf8_string,-1,pRes,res_len))&lt;br /&gt;
		{&lt;br /&gt;
			delete [] pRes;&lt;br /&gt;
			return 0;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		return pRes;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	//unicode-&amp;gt;1251&lt;br /&gt;
	static char * unicode_to_1251__dontForgetDeleteArr(const wchar_t *unicode_string)&lt;br /&gt;
	{&lt;br /&gt;
		char* pRes=0;&lt;br /&gt;
		int res_len=0;&lt;br /&gt;
&lt;br /&gt;
		//тест на возможность преобразования&lt;br /&gt;
		res_len = WideCharToMultiByte(1251,0,unicode_string,-1,0,0,0,0);&lt;br /&gt;
		if(!res_len)return 0;&lt;br /&gt;
&lt;br /&gt;
		//выделяем память&lt;br /&gt;
		pRes=new char[res_len];&lt;br /&gt;
		if(!pRes)return 0;&lt;br /&gt;
&lt;br /&gt;
		//преобразование&lt;br /&gt;
		if(!WideCharToMultiByte(1251,0,unicode_string,-1,pRes,res_len,0,0))&lt;br /&gt;
		{&lt;br /&gt;
			delete [] pRes;&lt;br /&gt;
			return 0;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		return pRes;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	//процедура с примером&lt;br /&gt;
	static void Example()&lt;br /&gt;
	{&lt;br /&gt;
		wchar_t* unicode_string=0;&lt;br /&gt;
		char* cp1251_string=0;&lt;br /&gt;
&lt;br /&gt;
		//исходный текст&lt;br /&gt;
		char utf8_string[] = &amp;quot;UTF-8 + СЂСѓСЃСЃРєРёР№ С‚РµРєСЃС‚&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
		for(;;)&lt;br /&gt;
		{&lt;br /&gt;
&lt;br /&gt;
			unicode_string=utf8_to_unicode__dontForgetDeleteArr(utf8_string);&lt;br /&gt;
			if(!unicode_string)&lt;br /&gt;
			{&lt;br /&gt;
				AfxMessageBox(&amp;quot;Не удалось конвертировать в unicode!&amp;quot;);&lt;br /&gt;
				break;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			cp1251_string = unicode_to_1251__dontForgetDeleteArr(unicode_string);&lt;br /&gt;
&lt;br /&gt;
			if(!cp1251_string)&lt;br /&gt;
			{&lt;br /&gt;
				AfxMessageBox(&amp;quot;Не удалось конвертировать из unicode!&amp;quot;);&lt;br /&gt;
				break;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			break;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		//cp1251_string - результат&lt;br /&gt;
		AfxMessageBox(cp1251_string);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
		//не забываем удалить массивы&lt;br /&gt;
		if(unicode_string)&lt;br /&gt;
		{&lt;br /&gt;
			delete [] unicode_string;&lt;br /&gt;
			unicode_string=0;&lt;br /&gt;
		}&lt;br /&gt;
		if(cp1251_string)&lt;br /&gt;
		{&lt;br /&gt;
			delete [] cp1251_string;&lt;br /&gt;
			cp1251_string=0;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
//вызов примера&lt;br /&gt;
coder::Example();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как организовать взаимодействие программы на VC.net с Access-овской базой данных?===&lt;br /&gt;
Проще всего подключить ADO компоненты и сделать все на них.&lt;br /&gt;
Компоненты  ADO (ADODC,DATAGRID и т.п.) это ActiveX.&lt;br /&gt;
В редакторе ресурсов, во всплывающем меню, есть Insert ActiveX Control -&amp;gt; открывается список всех компоент,&lt;br /&gt;
зарегистрированых на машине. Нужно найти компоненты (Это компоненты от MS и они помечены (OLEDB)) и вставить их в диалог. Для того что бы иметь возможность управлять ими, нужно импортировать обертки для них, это делается при помощи ClassWisard, там есть импорт-&amp;gt;класс-&amp;gt;указать файл с компоентой (OSX).&lt;br /&gt;
Появляется список всех классов, объявленых внутри.&lt;br /&gt;
Проставляем галочки, нажимаем ОК.&lt;br /&gt;
&lt;br /&gt;
[[Category:FAQ]]&lt;/div&gt;</summary>
		<author><name>Mczim</name></author>	</entry>

	<entry>
		<id>https://wiki.shelek.ru/index.php?title=FAQ:WinAPI,_VCPP_Part_3&amp;diff=411</id>
		<title>FAQ:WinAPI, VCPP Part 3</title>
		<link rel="alternate" type="text/html" href="https://wiki.shelek.ru/index.php?title=FAQ:WinAPI,_VCPP_Part_3&amp;diff=411"/>
				<updated>2008-08-14T18:46:57Z</updated>
		
		<summary type="html">&lt;p&gt;Mczim: кстати &amp;gt; кстате + Пример 1. убрал, так как он единственный&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Имеется приложение на основе CRichEditView. Как узнать, что пользователь меняет текст?===&lt;br /&gt;
Добавить обработчик сообщения EN_CHANGE. Сообщение генерируется CRichEditView каждый раз, когда пользователь изменяет текст в окне CRichEditView&lt;br /&gt;
===Чем метод CArray::GetSize отличается от метода CArray::GetCount?===&lt;br /&gt;
Абсолютно ничем. (Скорее всего, были предыдущие библиотеки, в которых функции, одинаковые по смыслу, имели разные имена. Поэтому в целях совместимости оставили оба)&lt;br /&gt;
===Как загрузить строку из ресурса?===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CString m_Temp;&lt;br /&gt;
m_Temp.LoadString(ID_MYSTRING);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как поменять иконку у элемента (item) в CListCtrl?===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//заполняем структуру LVITEM&lt;br /&gt;
LVITEM lvItem;&lt;br /&gt;
memset(&amp;amp;lvItem,0,sizeof(lvItem));&lt;br /&gt;
	&lt;br /&gt;
lvItem.mask = LVIF_IMAGE;//меняться будет картинка&lt;br /&gt;
lvItem.iItem = ...;// индекс элемента списка (Zero-based)&lt;br /&gt;
lvItem.iSubItem = 0;&lt;br /&gt;
lvItem.iImage = ...; //индекс иконки (из списка контрола)&lt;br /&gt;
	&lt;br /&gt;
pList-&amp;gt;SetItem(&amp;amp; lvItem);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Имеется класс Class1, содержащий мембер типа указатель на Class2. В Class2 также имеется указатель на Class1. Компилятор выдаёт ошибку. Что надо делать?===&lt;br /&gt;
Предварительно объявляем класс Class2. Тогда компилятору будет известно, что описание класса Class2 будет встречено дальше, и станет возможным объявление указателей на класс до описания самого класса.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Class2;//предопределение&lt;br /&gt;
	&lt;br /&gt;
Class1&lt;br /&gt;
{&lt;br /&gt;
	Class2* p;&lt;br /&gt;
};&lt;br /&gt;
	&lt;br /&gt;
Class2&lt;br /&gt;
{&lt;br /&gt;
	Class1* p;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как переключить раскладку в другом (то есть в активном) процессе?===&lt;br /&gt;
Использовать функции:&lt;br /&gt;
   GetKeyboardLayout - определить текущую раскладку&lt;br /&gt;
   LoadKeyboardLayout - загрузить новую раскладку&lt;br /&gt;
&lt;br /&gt;
см.также&lt;br /&gt;
   VerLanguageName - получить строку с описанием языка&lt;br /&gt;
&lt;br /&gt;
(подробности - в MSDN)&lt;br /&gt;
===Как получить хендл контрола Edit зная его ID?===&lt;br /&gt;
Пусть контрол лежит на окне CMyWnd&lt;br /&gt;
Тогда:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void CMyWnd::некая_процедура()&lt;br /&gt;
{&lt;br /&gt;
	//для MFC&lt;br /&gt;
	CEdit* ed=(CEdit* ) GetDlgItem(ID_EDIT1);&lt;br /&gt;
	HWND hwnd=ed-&amp;gt;GetSafeHwnd();&lt;br /&gt;
	...&lt;br /&gt;
	&lt;br /&gt;
	//для Win32 API&lt;br /&gt;
	HWND hwnd=GetDlgItem(m_hWnd,ID_EDIT1);&lt;br /&gt;
	...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Как из дочернего окна закрыть приложение?===&lt;br /&gt;
Нужно послать родительскому окну (*pParent) сообщение WM_CLOSE:&lt;br /&gt;
 pParent-&amp;gt;PostMessage(WM_CLOSE);//MFC&lt;br /&gt;
или&lt;br /&gt;
 ::PostMessage(pParent-&amp;gt;m_hWnd,WM_CLOSE,(WPARAM)0,(LPARAM)0);//API&lt;br /&gt;
===Как корректно перевести BSTR в CString и наоборот?===&lt;br /&gt;
Нужно просто присвоить переменной типа CString переменную типа BSTR.&lt;br /&gt;
Оператор = класса CString сам всё переведёт.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//указатель на будущий буфер с BSTR.&lt;br /&gt;
//	(По сути, BSTR определён как &lt;br /&gt;
//	typedef WCHAR* BSTR;&lt;br /&gt;
//	то есть указатель на 16-битный символ юникод)&lt;br /&gt;
	&lt;br /&gt;
BSTR bstrHE=0;&lt;br /&gt;
	&lt;br /&gt;
CString Str=&amp;quot;мой текст&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
//Выделить память и загрузить адрес блока в bstrHE&lt;br /&gt;
bstrHE=Str.AllocSysString();&lt;br /&gt;
	&lt;br /&gt;
//...	&lt;br /&gt;
//тут работаем с bstrHE[]&lt;br /&gt;
//...&lt;br /&gt;
	&lt;br /&gt;
//освобождаем память&lt;br /&gt;
SysFreeString(bstrHE);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Как получить доступ к графическим ресурсам элементов текущей темы оформления Windows?===&lt;br /&gt;
Использовать функции&lt;br /&gt;
&lt;br /&gt;
OpenThemeData()&lt;br /&gt;
DrawThemeBackground()&lt;br /&gt;
DrawFrameControl()&lt;br /&gt;
CloseThemeData().&lt;br /&gt;
&lt;br /&gt;
(подробности - в MSDN)&lt;br /&gt;
===Имеется класс , производный от CDialog. Когда диалог в фокусе, нажатие на Enter или Esc приводит к закрытию диалога. Как это запретить?===&lt;br /&gt;
При нажатии Enter происходит выполнение команды IDOK,&lt;br /&gt;
при нажатии Esc - IDCANCEL.&lt;br /&gt;
Нужно переопределить в классе виртуальные функции OnOk() и OnCancel(),&lt;br /&gt;
которые соответственно вызываются для этих команд. При помощи&lt;br /&gt;
визарда эти функции добавить можно так: Положить на диалог две кнопки&lt;br /&gt;
с идентификаторами IDOK и IDCANCEL (при создании нового диалога они там&lt;br /&gt;
есть сразу), затем двойной клик по кнопке добавляет соответствующий&lt;br /&gt;
обработчик. В обработчиках надо удалить вызовы СDialog::OnOK() и&lt;br /&gt;
CDialog::OnCancel(), тогда диалог закрываться не будет.&lt;br /&gt;
Однако тогда диалог станет невозможно закрыть кнопкой с крестиком  :)&lt;br /&gt;
&lt;br /&gt;
Лечить так: добавить обработчик сообщения WM_CLOSE - OnClose(), и в нём&lt;br /&gt;
сделать вызов OnOk() или OnCancel() :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void CPlayersPropsDialog::OnClose() &lt;br /&gt;
{&lt;br /&gt;
	CDialog::OnClose();&lt;br /&gt;
	CDialog::OnCancel();//добавлено&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===VC++6. Я написал простейший макрос, а компилятор на него ругается. Ума не приложу, что за глюк?===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	#define my_macr(x,y,z) \&lt;br /&gt;
		z=\&lt;br /&gt;
		(x+y)*\&lt;br /&gt;
		(x-y)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Скорее всего после одного из символов соединения строк &amp;quot;\&amp;quot; имеется&lt;br /&gt;
пробел или табуляция. Их надо удалить. Можно найти их &amp;quot;наощупь&amp;quot;, а&lt;br /&gt;
можно включить показ непечатных символов в студии. Найти эту команду&lt;br /&gt;
можно так:&lt;br /&gt;
Tools-&amp;gt;Customize...-&amp;gt;вкладка Commands. В окошке Category выбрать&lt;br /&gt;
&amp;quot;Edit&amp;quot;, и среди кнопок справа найти кнопку, на которой написано &amp;quot;a.b&amp;quot;&lt;br /&gt;
Эту кнопку надо перетащить на одну из панелей инструментов студии.&lt;br /&gt;
&lt;br /&gt;
===Как получить список всех процесов, включая idle?===&lt;br /&gt;
Использовать функции&lt;br /&gt;
Process32First()&lt;br /&gt;
Precess32Next()&lt;br /&gt;
&lt;br /&gt;
===Как программно установить переменные окружения?===&lt;br /&gt;
Чтобы добавить или изменить их программно, необходимо воспользоваться&lt;br /&gt;
ключом реестра HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\&lt;br /&gt;
Session Manager\Environment, а затем отправить широковещательное&lt;br /&gt;
сообщение WM_SETTINGCHANGE. Это позволит приложениям узнать об&lt;br /&gt;
изменениях:&lt;br /&gt;
&lt;br /&gt;
::SendMessage(HWND_BROADCAST,WM_SETTINGCHANGE,0,0);&lt;br /&gt;
===Как сделать, чтобы у окна был черный фон?===&lt;br /&gt;
переопределить обработчик сообщения WM_CTLCOLOR - OnCtlColor() :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CBrush br(RGB(0,0,0));&lt;br /&gt;
	&lt;br /&gt;
HBRUSH CMyDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) &lt;br /&gt;
{&lt;br /&gt;
	HBRUSH hbr = CMyDlg::OnCtlColor(pDC, pWnd, nCtlColor);&lt;br /&gt;
	&lt;br /&gt;
	//фон диалога (или вьюшки)&lt;br /&gt;
	if(nCtlColor==CTLCOLOR_DLG)&lt;br /&gt;
	{&lt;br /&gt;
		return (HBRUSH)br;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	//фон статиков (если нужно)&lt;br /&gt;
	if(nCtlColor==CTLCOLOR_STATIC)&lt;br /&gt;
	{&lt;br /&gt;
		//делаем фон текста статика прозрачным&lt;br /&gt;
		pDC-&amp;gt;SetBkMode(TRANSPARENT);&lt;br /&gt;
		return (HBRUSH)br;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	return hbr;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Почему на моем компьютере экзешник, созданный в MFC запускается, а на других компьютерах - нет? Требует какую-то  dll-ку.===&lt;br /&gt;
Нужно выбирать режим Release :&lt;br /&gt;
&lt;br /&gt;
Menu-&amp;gt;Build-&amp;gt;Configurations...-&amp;gt;Release,&lt;br /&gt;
&lt;br /&gt;
и экзешник, соответственно, брать из папки Release проекта&lt;br /&gt;
===Как в диалог добавить меню?===&lt;br /&gt;
Надо сделать в ресурсах меню, затем вставить в диалог:&lt;br /&gt;
&lt;br /&gt;
открыть в редакторе диалог, в свойствах (во вкладке General, окошко Menu) указать идентивикатор ресурса меню.&lt;br /&gt;
При помощи визарда добавить для меню обработчики OnCommand() и OnUpdateСommand().&lt;br /&gt;
===Я добавил визардом меню в диалог. Добавил обработчики для пунктов меню. Пункты работают, но OnUpdate для пунктов не вызывается - то есть не получается ни затенить, ни чек поставить. Что делать?===&lt;br /&gt;
В диалоге у меню апдейта не происходит сам, в отличие от мейнфрейма.&lt;br /&gt;
Для этого нужно сделать самим апдейт в обработчике сообщения WM_KICKIDLE.&lt;br /&gt;
Визардом обработчик не добавляется, поэтому можно переопределить виртуальную DefWindowProc() и там обработать:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;afxpriv.h&amp;gt;	//этот файл надо включить, там определёна WM_KICKIDLE&lt;br /&gt;
&lt;br /&gt;
LRESULT CMyDialog::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam) &lt;br /&gt;
{&lt;br /&gt;
	if(message==WM_KICKIDLE)&lt;br /&gt;
	{&lt;br /&gt;
		//делаем апдейт для всех пунктов меню&lt;br /&gt;
		CMenu* pMainMenu=GetMenu();&lt;br /&gt;
		if(pMainMenu)&lt;br /&gt;
		{&lt;br /&gt;
			CCmdUI cmdUI;&lt;br /&gt;
			for (UINT n=0; n &amp;lt; pMainMenu-&amp;gt;GetMenuItemCount(); ++n)&lt;br /&gt;
			{&lt;br /&gt;
				CMenu* pSubMenu = pMainMenu-&amp;gt;GetSubMenu(n);&lt;br /&gt;
				if(!pSubMenu)continue;&lt;br /&gt;
	&lt;br /&gt;
				cmdUI.m_nIndexMax = pSubMenu-&amp;gt;GetMenuItemCount();&lt;br /&gt;
				for (UINT i = 0; i &amp;lt; cmdUI.m_nIndexMax;++i)&lt;br /&gt;
				{&lt;br /&gt;
					cmdUI.m_nIndex = i;&lt;br /&gt;
					cmdUI.m_nID = pSubMenu-&amp;gt;GetMenuItemID(i);&lt;br /&gt;
					cmdUI.m_pMenu = pSubMenu;&lt;br /&gt;
					cmdUI.DoUpdate(this, FALSE);&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	return CDialog::DefWindowProc(message, wParam, lParam);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Как на Visual C++ 6.0 в Главном окне отключить системное меню (в левом верхнем углу) и кнопки(в правом верхнем углу)?===&lt;br /&gt;
При создании окна нужно убрать стиль WS_SYSMENU&lt;br /&gt;
(теперь пользователь корректно может закрыть окно только Alt+F4,&lt;br /&gt;
ну или если вы предоставите ему дополнительную возможность сделать это)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пример 1. (для SDI, MDI)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//этот обработчик уже добавлен визардом&lt;br /&gt;
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT&amp;amp; cs)&lt;br /&gt;
{&lt;br /&gt;
	if( !CFrameWnd::PreCreateWindow(cs) )&lt;br /&gt;
		return FALSE;&lt;br /&gt;
	// TODO: Modify the Window class or styles here by modifying&lt;br /&gt;
	//  the CREATESTRUCT cs&lt;br /&gt;
&lt;br /&gt;
	///////////////////////////////&lt;br /&gt;
	//добавленная часть&lt;br /&gt;
	{&lt;br /&gt;
		//убираем стиль&lt;br /&gt;
		cs.style&amp;amp;=~WS_SYSMENU;&lt;br /&gt;
	}&lt;br /&gt;
	///////////////////////////////&lt;br /&gt;
&lt;br /&gt;
	return TRUE;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Пример 2. (для диалога)&lt;br /&gt;
Если диалог описан в ресурсах, то в свойствах диалога убрать галочки&lt;br /&gt;
  &amp;quot;System menu&amp;quot;&lt;br /&gt;
  &amp;quot;Minimize box&amp;quot;&lt;br /&gt;
  &amp;quot;Maximize box&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===Хочу сделать так, чтобы пользователь не мог нажать на кнопку, пока программа не разрешит.===&lt;br /&gt;
Нужно применить метод класса CWnd::EnableWindow(...) для кнопки.&lt;br /&gt;
Значение параметра 0 делает кнопку неактивной, 1 - делает активной.&lt;br /&gt;
(кстате, не только для кнопки можно, а для любого класса, производного&lt;br /&gt;
от класса CWnd)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пусть имеется некий диалог, на нём лежит кнопка c ID == IDC_1.&lt;br /&gt;
в любом месте кода диалога (кроме конструктора и деструктора , хотя, если&lt;br /&gt;
проверить наличие валидного хендла диалога, как в примере, то ничего&lt;br /&gt;
страшного не будет и там)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//делаем кнопку неактивной&lt;br /&gt;
if(m_hWnd)&lt;br /&gt;
{&lt;br /&gt;
	CWnd* pw=0;&lt;br /&gt;
	pw=GetDlgItem(IDC_1);&lt;br /&gt;
	if(pw)pw-&amp;gt;EnableWindow(0);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Что означают сообщения, которые студия выводит при компиляции, вроде таких : Loaded 'C:\WINDOWS\SYSTEM\WSOCK32.DLL', no matching symbolic information found. ===&lt;br /&gt;
Это строка говорит о том, что студия не смогла найти отладочные&lt;br /&gt;
символы для WSOCK32.DLL. В этом нет ничего страшного, просто при наличии&lt;br /&gt;
отладочных символов в процессе отладки можно получить доступ к именам&lt;br /&gt;
функции из системных DLL. Например, вместо&lt;br /&gt;
 KERNEL32! 0x77E8B184() -&lt;br /&gt;
 увидим&lt;br /&gt;
 KERNEL32!CreateThread.&lt;br /&gt;
===Как обработать сообщения , которое приходит к некому контролу (скажем CEdit) ?===&lt;br /&gt;
Нужно произвести от CEdit свой класс, и в виртуальной процедуре класса WindowProc перехватить нужные сообщения.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
virtual LRESULT WindowProc(&lt;br /&gt;
   UINT message,&lt;br /&gt;
   WPARAM wParam,&lt;br /&gt;
   LPARAM lParam &lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Пример. Полностью выключаем, скажем, обработку сообщения WM_CHAR&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	LRESULT CMyEdit::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) &lt;br /&gt;
	{&lt;br /&gt;
		switch(message)&lt;br /&gt;
		{&lt;br /&gt;
			case WM_CHAR:&lt;br /&gt;
			{&lt;br /&gt;
				return 0;&lt;br /&gt;
			}&lt;br /&gt;
			break;&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		return CEdit::WindowProc(message, wParam, lParam);&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Чтобы связать экземпляр класса с контролом на форме, добавьте визардом для&lt;br /&gt;
контрола переменную класса (выбрав не Value а Control).&lt;br /&gt;
===Как настроить количество пробелов в табуляции?===&lt;br /&gt;
Tools-&amp;gt;Options-&amp;gt;Tabs-&amp;gt;Insert Spaces&lt;br /&gt;
(или  правой кнопкой мыши по тексту-&amp;gt; properties)&lt;br /&gt;
===Как автоматически расставить отступы?===&lt;br /&gt;
Выделить текст для форматирования, нажать Alt+F8&lt;br /&gt;
&lt;br /&gt;
Есть ещё программа Artistic Style, которая занимается&lt;br /&gt;
переформатированием кода&lt;br /&gt;
http://sourceforge.net/projects/astyle/&lt;br /&gt;
===Поиск границ блока===&lt;br /&gt;
&amp;quot;CTRL+ }&amp;quot; ищет парную фигурную скобку в тексте и переходит на неё&lt;br /&gt;
===Вертикальное выделение текста===&lt;br /&gt;
&amp;quot;Alt + выделение мышкой&amp;quot; - позволяет выделять вертикальные фрагменты текста&lt;br /&gt;
===Как узнать количество установленных в CListCtrl столбцов ?===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CListCtrl* pL=...; //указатель на переменную-контрол&lt;br /&gt;
&lt;br /&gt;
int count=pL-&amp;gt;GetHeaderCtrl()-&amp;gt;GetItemCount();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как получить иконку приложения?===&lt;br /&gt;
Если приложение запущено, то нужно найти его главное окно и&lt;br /&gt;
послать ему сообщение WM_GETICON.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//функция возвращант хендл иконки &lt;br /&gt;
LRESULT SendMessage(hWnd, WM_GETICON, wParam, 0);&lt;br /&gt;
&lt;br /&gt;
//hWnd == хендл окна приложения&lt;br /&gt;
//wParam == &lt;br /&gt;
//	1)==ICON_BIG - получить большую иконку&lt;br /&gt;
//	2)==ICON_SMALL - получить маленькую иконку&lt;br /&gt;
//	3)==ICON_SMALL2 - получить маленькую иконку, если она определена&lt;br /&gt;
//				в приложении. Если её нет, то маленькую иконку, &lt;br /&gt;
//				сгенерированную системой из большой иконки&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как в CString можно найти или вырезать часть строки?===&lt;br /&gt;
есть такие методы в CString :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//вырезает кусок строки&lt;br /&gt;
CString Mid(int nFirst) const;&lt;br /&gt;
CString Mid(int nFirst,  int nCount) const;&lt;br /&gt;
&lt;br /&gt;
//возвращает кусок строки (сначала или с конца)&lt;br /&gt;
CString Left(int nCount ) const;&lt;br /&gt;
CString Right(int nCount ) const;&lt;br /&gt;
&lt;br /&gt;
//возвращает начальный кусок строки, в котором есть только&lt;br /&gt;
//символы из набора,представленного в lpszCharSet&lt;br /&gt;
CString SpanIncluding(LPCTSTR lpszCharSet ) const;&lt;br /&gt;
&lt;br /&gt;
//возвращает начальный кусок строки, в котором нет&lt;br /&gt;
//символов из набора,представленного в lpszCharSet&lt;br /&gt;
CString SpanExcluding(LPCTSTR lpszCharSet ) const; &lt;br /&gt;
&lt;br /&gt;
//убирает &amp;quot;пробелоподобные&amp;quot; символы из самого начала строки&lt;br /&gt;
//(то есть - пробел, табуляцию (\t) , возврат каретки, перевод строки (/r/n))&lt;br /&gt;
void TrimLeft();&lt;br /&gt;
//убирает все повторы символа из самого начала строки&lt;br /&gt;
void TrimLeft(TCHAR chTarget );&lt;br /&gt;
//убирает из самого начала строки все символа из набора lpszTargets &lt;br /&gt;
void TrimLeft(LPCTSTR lpszTargets ); &lt;br /&gt;
&lt;br /&gt;
void TrimRight();&lt;br /&gt;
void TrimRight(TCHAR chTarget );&lt;br /&gt;
void TrimRight(LPCTSTR lpszTargets ); &lt;br /&gt;
&lt;br /&gt;
//поиск в строке&lt;br /&gt;
int Find( TCHAR ch ) const;&lt;br /&gt;
int Find( LPCTSTR lpszSub ) const;&lt;br /&gt;
int Find( TCHAR ch, int nStart ) const;&lt;br /&gt;
int Find( LPCTSTR pstr, int nStart ) const;&lt;br /&gt;
&lt;br /&gt;
//поиск, начиная с конца&lt;br /&gt;
int ReverseFind( TCHAR ch ) const;&lt;br /&gt;
&lt;br /&gt;
//поиск позиции первого символа, одного из набора,&lt;br /&gt;
// представленного в lpszCharSet&lt;br /&gt;
int FindOneOf( LPCTSTR lpszCharSet ) const;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Есть у меня CListBox и я в ходе выполнения программы добавляю в него строки. Но я не могу посмотреть что именно добавляется. Вывод результатов происходит в конце выполнения процедуры...===&lt;br /&gt;
Если нужно делать принудительную перерисовку окна во время&lt;br /&gt;
длительных вычислений, то нужно вызывать для окна, которое&lt;br /&gt;
надо перерисовать метод&lt;br /&gt;
  RedrawWindow()&lt;br /&gt;
с параметрами по умолчанию, или пару&lt;br /&gt;
  Invalidate(0);&lt;br /&gt;
  UpdateWindow();&lt;br /&gt;
Это приводит к пометке всего окна к перерисовке и отправлению&lt;br /&gt;
сообщения WM_PAINT в оконную процедуру в обход очереди&lt;br /&gt;
сообщений, вызывая немедленную перерисовку окна.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CWnd* pw=...;//окно , которое надо перерисовывать&lt;br /&gt;
&lt;br /&gt;
for(int i=0;i&amp;lt;10000)&lt;br /&gt;
{&lt;br /&gt;
	//меняется содержимое окна&lt;br /&gt;
	//...&lt;br /&gt;
&lt;br /&gt;
	//немедленная перерисовка&lt;br /&gt;
	pw-&amp;gt;Invalidate(0);&lt;br /&gt;
	pw-&amp;gt;UpdateWindow();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Я написал DLL , которую используют несколько приложений. Всё вроде работает, но когда происходит очередной вызов функции из DLL , почему то данные в функции обнуляются. С чем это связано ?===&lt;br /&gt;
Переменные и массивы в DLL, содержимое которых должно использоваться несколькими процессами, должны объявляться статическими. Статическая переменная или массив инициализируются только один раз в момент загрузки DLL.&lt;br /&gt;
Пример:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DWORD calltest()&lt;br /&gt;
{&lt;br /&gt;
	//будет выполнено только при первом вызове&lt;br /&gt;
	static DWORD callcount=0;&lt;br /&gt;
	static DWORD str[1000]={0}; &lt;br /&gt;
&lt;br /&gt;
	//будет выполняться каждый раз&lt;br /&gt;
	return ++callcount;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как открыть проекцию файла в память и как с ней работать?===&lt;br /&gt;
Как открыть проекцию файла в память и как с ней работать?&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HANDLE CreateFileMapping(&lt;br /&gt;
  HANDLE hFile,	//хендл уже открытого файла&lt;br /&gt;
  LPSECURITY_ATTRIBUTES lpAttributes,&lt;br /&gt;
  DWORD flProtect,	//способ открытия проекции&lt;br /&gt;
  DWORD dwMaximumSizeHigh,	//размер файла (старшие 4 байта , обычно==0)&lt;br /&gt;
  DWORD dwMaximumSizeLow,	//размер файла (младшие 4 байта)&lt;br /&gt;
  LPCTSTR lpName&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Доступ к созданной проекции производится процедурой&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LPVOID MapViewOfFile(&lt;br /&gt;
  HANDLE hFileMappingObject, //хендл проекции&lt;br /&gt;
  DWORD dwDesiredAccess,	//способ работы с проекцией&lt;br /&gt;
  DWORD dwFileOffsetHigh,&lt;br /&gt;
  DWORD dwFileOffsetLow, //смещение от начала файла (младшие 4 байта)&lt;br /&gt;
  SIZE_T dwNumberOfBytesToMap //длина в байтах (если ==0 - то весь файл)&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
далее с файлом можно работать как с обычным массивом в памяти.&lt;br /&gt;
&lt;br /&gt;
После работы с проекцией , её надо освободить процедурой&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
BOOL UnmapViewOfFile(&lt;br /&gt;
  LPCVOID lpBaseAddress //адрес, который вернула процедура MapViewOfFile&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Пример.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HANDLE hMapFile=0;//для проекции&lt;br /&gt;
&lt;br /&gt;
HANDLE hFile=...;//хендл уже открытого файла&lt;br /&gt;
DWORD dwdFileLen=...;//размер открытого файла&lt;br /&gt;
&lt;br /&gt;
//создаём проекцию &amp;quot;только для чтения&amp;quot;&lt;br /&gt;
hMapFile=::CreateFileMapping(hFile,0,PAGE_READONLY,0,dwdFileLen,0);&lt;br /&gt;
&lt;br /&gt;
//хендл hFile можно закрыть уже здесь, в принципе,&lt;br /&gt;
//но мы сделаем это позже&lt;br /&gt;
&lt;br /&gt;
//получаем доступ к проекции (тоже только для чтения)&lt;br /&gt;
BYTE* pbyFile=(BYTE*)::MapViewOfFile(hMapFile,FILE_MAP_READ,0,0,0);&lt;br /&gt;
&lt;br /&gt;
///////////////////&lt;br /&gt;
//тут работаем с массивом pbyFile[dwdFileLen] как с обычным,&lt;br /&gt;
//только не забываем, что он открыт только для чтения&lt;br /&gt;
//...&lt;br /&gt;
//...&lt;br /&gt;
//...&lt;br /&gt;
///////////////////&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//отключаем файл данных от адресного пространства&lt;br /&gt;
UnmapViewOfFile(pbyFile);&lt;br /&gt;
&lt;br /&gt;
//освобождаем хендл проекции&lt;br /&gt;
CloseHandle(hMapFile)&lt;br /&gt;
&lt;br /&gt;
//освобождаем хендл открытого файла&lt;br /&gt;
CloseHandle(hFile);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Использую MFC Grid control 2.25 , не получается отобразить картинку в ячейке. Как это делается ?===&lt;br /&gt;
Нужно создать список изображений (CImageList) , затем передать указатель на список в контрол. Поскольку контрол лишь копирует указатель , список должен создаваться динамически, либо быть членом класса, экземпляр которого существует всё время работы контрола.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 m_GridMarket&lt;br /&gt;
CImageList m_ImageList;&lt;br /&gt;
CGridCtrL m_Grid1&lt;br /&gt;
...&lt;br /&gt;
...&lt;br /&gt;
//неким образом создаётся список&lt;br /&gt;
m_ImageList.Create(...);&lt;br /&gt;
//...&lt;br /&gt;
&lt;br /&gt;
//вставляем в контрол&lt;br /&gt;
m_Grid1.SetImageList(&amp;amp;m_ImageList);&lt;br /&gt;
&lt;br /&gt;
//&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как при помощи IPicture отобразить картинку из файла? ===&lt;br /&gt;
Пример - несложная функция, отображающая картинку из файла&lt;br /&gt;
&lt;br /&gt;
поддерживаются форматы&lt;br /&gt;
BMP, GIF, JPEG, PNG, TIFF, EMF&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;quot;atlconv.h&amp;quot;&lt;br /&gt;
#define HandleIsValid(H) (H!=(HANDLE)-1 &amp;amp;&amp;amp; H!=(HANDLE)0)&lt;br /&gt;
&lt;br /&gt;
//*pDestDC - CDC, на который предполагается вывод картинки&lt;br /&gt;
//pchzFilePath - путь к файлу&lt;br /&gt;
//pWid - (возвращает) ширина картинки&lt;br /&gt;
//pHig - (возвращает) высота картинки&lt;br /&gt;
bool DrawBitmapFromFile(CDC* pDestDC,const char* pchzFilePath,int *pWid=0,int *pHig=0)&lt;br /&gt;
{&lt;br /&gt;
	bool result=false;&lt;br /&gt;
&lt;br /&gt;
	if(pWid)*pWid=0;&lt;br /&gt;
	if(pHig)*pHig=0;&lt;br /&gt;
&lt;br /&gt;
	int Wid=0;&lt;br /&gt;
	int Hig=0;&lt;br /&gt;
&lt;br /&gt;
	IPicture* pPic=0;&lt;br /&gt;
	try&lt;br /&gt;
	{&lt;br /&gt;
		IPicture* ptmpPic=0;&lt;br /&gt;
		USES_CONVERSION;&lt;br /&gt;
		HRESULT hr;&lt;br /&gt;
&lt;br /&gt;
		CString txt=pchzFilePath;&lt;br /&gt;
		hr= ::OleLoadPicturePath(&lt;br /&gt;
			const_cast&amp;lt;LPOLESTR&amp;gt;(T2COLE(txt)),&lt;br /&gt;
			0,0,0,IID_IPicture,&lt;br /&gt;
			reinterpret_cast&amp;lt;void **&amp;gt;(&amp;amp;ptmpPic)&lt;br /&gt;
			);&lt;br /&gt;
&lt;br /&gt;
		if(hr==S_OK &amp;amp;&amp;amp; ptmpPic)&lt;br /&gt;
		{&lt;br /&gt;
			pPic=ptmpPic;&lt;br /&gt;
		}&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			throw 0;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		OLE_XPOS_HIMETRIC cxSrc;&lt;br /&gt;
		OLE_YPOS_HIMETRIC cySrc;&lt;br /&gt;
&lt;br /&gt;
		if(S_OK!=pPic-&amp;gt;get_Width(&amp;amp;cxSrc))throw 0;&lt;br /&gt;
		if(S_OK!=pPic-&amp;gt;get_Height(&amp;amp;cySrc))throw 0;&lt;br /&gt;
&lt;br /&gt;
		Wid=cxSrc/26;&lt;br /&gt;
		Hig=cySrc/26;&lt;br /&gt;
&lt;br /&gt;
		//рисуем&lt;br /&gt;
		if(S_OK !=pPic-&amp;gt;Render(pDestDC-&amp;gt;GetSafeHdc(),&lt;br /&gt;
			0,Hig,Wid,-Hig,0,0,cxSrc,cySrc,0))throw 0;&lt;br /&gt;
	}&lt;br /&gt;
	catch(...)&lt;br /&gt;
	{&lt;br /&gt;
		result=false;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if(pPic)&lt;br /&gt;
	{&lt;br /&gt;
		pPic-&amp;gt;Release();&lt;br /&gt;
		pPic=0;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	if(pWid)*pWid=Wid;&lt;br /&gt;
	if(pHig)*pHig=Hig;&lt;br /&gt;
&lt;br /&gt;
	return result;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===У меня модальное диалоговое окно, в нем поле редактирования мультилайновое, т.е. чтобы перейти на новую строку надо нажать ентер, но вызывается стандартный обработчик диалогового окна. Подскажите, что делать?===&lt;br /&gt;
Нужно в редакторе ресурсов поставить для CEdit окошка галочку&lt;br /&gt;
свойства WantReturn,&lt;br /&gt;
&lt;br /&gt;
или добавить ES_WANTRETURN при создании CEdit контрола динамически.&lt;br /&gt;
===Как выводят картинку-логотип(splash screen) при запуске программы? То есть, когда загружается программа на экран выводится картинка, потом она исчезает(загрузка программы закончена) и пользователь может приступать к работе ===&lt;br /&gt;
Для этого используется класс, производный от CDialog. Этот диалог после создания показывает себя на экран, выводя на себя рисунок. Также запускает таймет, по срабатывани которого диалог гасится. Создаётся диалог InitInstance приложения.&lt;br /&gt;
&lt;br /&gt;
В VC6++ также есть уже готовый компонент&lt;br /&gt;
Project-&amp;gt;Add To Project -&amp;gt; Components and Controls-&amp;gt;(в папке &amp;quot;Visual C++ Components&amp;quot; есть SplashScreen.)&lt;br /&gt;
===Как сделать, чтобы при выпадении списка у ComboBox была не одна строка, а больше, вроде все свойства покрутил, не помогает Вместо выпадающего списка одна строка и скролл...===&lt;br /&gt;
В редакторе ресурсов надо щелкнуть в комбобоксе на треугольнике - появляется рамка для растягивания вниз - размер выпадающего списка.&lt;br /&gt;
===В VC++.net , что делать после того, как на форму установил ActiiveX ListView, как объявить класс и переменную для этого элемента?===&lt;br /&gt;
Щёлкнуть правой кнопкой мыши на элементе , в меню - add variable или add class&lt;br /&gt;
===Как вставить данные в буфер обмена (Clipboard) ? Как их оттуда вытащить ?===&lt;br /&gt;
&lt;br /&gt;
1) копирование в буфер обмена:&lt;br /&gt;
&lt;br /&gt;
  1.Готовим данные&lt;br /&gt;
    а.Выделяем память из кучи,  вызывая GlobalAlloc()&lt;br /&gt;
    б.Получаем указатель на выделенную память, вызывая GlobalLock()&lt;br /&gt;
    в.Заполняем данные&lt;br /&gt;
    г.Освобождаем указатель , вызывая GlobalUnlock();&lt;br /&gt;
&lt;br /&gt;
  2.Открываем буфер обмена , вызывая OpenClipboard();&lt;br /&gt;
  3.Очищаем буфер, вызывая EmptyClipboard();&lt;br /&gt;
  4.Вызываем SetClipboardData() один раз для каждого формата&lt;br /&gt;
      вставляемых данных (имеется в виду - если одни и те же&lt;br /&gt;
      данные представлены в разных форматах, и приложение&lt;br /&gt;
      может эти форматы создать)&lt;br /&gt;
  5.Закрываем буфер, вызывая CloseClipboard();&lt;br /&gt;
  6.ВЫЗЫВАТЬ GlobalFree() НЕ НУЖНО , в этом случае это&lt;br /&gt;
      предоставлено системе&lt;br /&gt;
&lt;br /&gt;
Скажем, хотим поместить в буфер обмена туда текст.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	//готовим данные&lt;br /&gt;
	//выделяем из кучи память для данных&lt;br /&gt;
	HANDLE hglbCopy = GlobalAlloc(GMEM_MOVEABLE,10);&lt;br /&gt;
	if(!hglbCopy)return;&lt;br /&gt;
&lt;br /&gt;
	//получаем указатель&lt;br /&gt;
	void* lpStr = GlobalLock(hglbCopy);&lt;br /&gt;
	if(!lpStr)return;&lt;br /&gt;
&lt;br /&gt;
	//заполняем данные&lt;br /&gt;
	strcpy((char*)lpStr,&amp;quot;my text&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	//освобождаем указатель&lt;br /&gt;
	GlobalUnlock(hglbCopy);&lt;br /&gt;
	lpStr=0;&lt;br /&gt;
&lt;br /&gt;
	//открываем буфер обмена&lt;br /&gt;
	OpenClipboard();&lt;br /&gt;
	//очищаем&lt;br /&gt;
	EmptyClipboard();&lt;br /&gt;
&lt;br /&gt;
	//текстовый формат&lt;br /&gt;
	SetClipboardData(CF_TEXT,hglbCopy);&lt;br /&gt;
&lt;br /&gt;
	//закрываем буфер&lt;br /&gt;
	CloseClipboard();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
2) извлечение из буфера обмена&lt;br /&gt;
&lt;br /&gt;
  1.Проверяем, что поддерживается нужный формат данных,&lt;br /&gt;
      вызывая IsClipboardFormatAvailable()&lt;br /&gt;
  2.Открываем буфер обмена , вызывая OpenClipboard();&lt;br /&gt;
  3.Достаём данные&lt;br /&gt;
   а.Получаем из буфера хендл требуемого формата,&lt;br /&gt;
      вызывая GetClipboardData()&lt;br /&gt;
    б.Получаем указатель на выделенную память, вызывая GlobalLock()&lt;br /&gt;
    в.Работаем с данными&lt;br /&gt;
    г.Освобождаем указатель , вызывая GlobalUnlock();&lt;br /&gt;
  4.Закрываем буфер, вызывая CloseClipboard();&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	//Проверяем, что поддерживается нужный формат данных,&lt;br /&gt;
	if(!IsClipboardFormatAvailable(CF_TEXT))return;&lt;br /&gt;
&lt;br /&gt;
	//открываем буфер обмена&lt;br /&gt;
	OpenClipboard();&lt;br /&gt;
&lt;br /&gt;
	//достаём данные&lt;br /&gt;
&lt;br /&gt;
	//текстовый формат&lt;br /&gt;
	HANDLE hglbCopy = GetClipboardData(CF_TEXT);&lt;br /&gt;
	if(!hglbCopy)return;&lt;br /&gt;
&lt;br /&gt;
	//получаем указатель&lt;br /&gt;
	void* lpStr = GlobalLock(hglbCopy);&lt;br /&gt;
	if(!lpStr)return;&lt;br /&gt;
&lt;br /&gt;
	//читаем данные&lt;br /&gt;
	char data[10];&lt;br /&gt;
	memmove(data,lpStr,sizeof(data));&lt;br /&gt;
&lt;br /&gt;
	//освобождаем указатель&lt;br /&gt;
	GlobalUnlock(hglbCopy);&lt;br /&gt;
	lpStr=0;&lt;br /&gt;
&lt;br /&gt;
	//закрываем буфер&lt;br /&gt;
	CloseClipboard();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как получить полный путь к экзешнику из самой программы ?===&lt;br /&gt;
В командную строку первым параметром система всегда передаёт заключённый в кавычки полный путь к файлу запущенной программы Достаём путь таким образом :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
BOOL CMyApp::InitInstance()&lt;br /&gt;
{&lt;br /&gt;
	//добыча полного имени экзешника&lt;br /&gt;
	CString csFullExeName;&lt;br /&gt;
	{&lt;br /&gt;
		CString csAppName=GetCommandLine();&lt;br /&gt;
		csAppName.Delete(0,1);&lt;br /&gt;
		csAppName.Replace('\&amp;quot;','\0');&lt;br /&gt;
		csFullExeName=(const char*)csAppName;&lt;br /&gt;
	}&lt;br /&gt;
	//теперь csFullExeName - содержит искомый путь&lt;br /&gt;
&lt;br /&gt;
	//...&lt;br /&gt;
	//...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Каким способом можно exe файл может заменить самого себя? То есть, моя программа обновляется, например, через Internet, и хочет обновить свой exe-файл. Но так как он в данный момент запущен - это будет, естественно, запрещено. Как это можно проще всего сделать?===&lt;br /&gt;
Один из способов - сделать копию экзешника и из него обновиться&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define def_exeNAMEup	&amp;quot;c:\\myprog_update.exe&amp;quot;&lt;br /&gt;
#define def_exeNAMEdnld	&amp;quot;c:\\myprog_downloaded.exe&amp;quot;&lt;br /&gt;
#define def_keyUdate	&amp;quot;/update&amp;quot;&lt;br /&gt;
&lt;br /&gt;
void CTESTFAQApp::UpdateItself()&lt;br /&gt;
{&lt;br /&gt;
	//добыча полного имени экзешника&lt;br /&gt;
	CString csFullExeName;&lt;br /&gt;
	{&lt;br /&gt;
		CString csAppName=GetCommandLine();&lt;br /&gt;
		csAppName.Delete(0,1);&lt;br /&gt;
		csAppName.Replace('\&amp;quot;','\0');&lt;br /&gt;
		csFullExeName=(const char*)csAppName;&lt;br /&gt;
	}&lt;br /&gt;
	//теперь csFullExeName - содержит искомый путь&lt;br /&gt;
&lt;br /&gt;
	//делаем копию экзешника с другим именем&lt;br /&gt;
	CopyFile(csFullExeName,def_exeNAMEup,0);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	//передаём в параметры нового процесса ключ и путь к текущему файлу&lt;br /&gt;
	CString csParams=def_keyUdate;&lt;br /&gt;
	csParams+=&amp;quot; &amp;quot;;&lt;br /&gt;
	csParams+=csFullExeName;&lt;br /&gt;
&lt;br /&gt;
	//запускаем копию&lt;br /&gt;
	STARTUPINFO si;&lt;br /&gt;
	PROCESS_INFORMATION pi;&lt;br /&gt;
	ZeroMemory(&amp;amp;si,sizeof(si));&lt;br /&gt;
	si.cb = sizeof(si);&lt;br /&gt;
	ZeroMemory(&amp;amp;pi,sizeof(pi));&lt;br /&gt;
	if(CreateProcess(def_exeNAMEup,def_keyUdate,0,0,0,0,0,0,&amp;amp;si,&amp;amp;pi))&lt;br /&gt;
	{&lt;br /&gt;
		//завершаем текущий процесс&lt;br /&gt;
		ExitFromMyApp();&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void CTESTFAQApp::ExitFromMyApp()&lt;br /&gt;
{&lt;br /&gt;
	exit(0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
BOOL CTESTFAQApp::InitInstance()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
	//смотрим, не запустили ли для апдейта?&lt;br /&gt;
&lt;br /&gt;
	CString txt;&lt;br /&gt;
	txt=m_lpCmdLine;&lt;br /&gt;
	if(txt.Find(def_keyUdate)==0)&lt;br /&gt;
	{&lt;br /&gt;
		//делаем айдейт&lt;br /&gt;
		txt.Replace(def_keyUdate,&amp;quot;&amp;quot;);&lt;br /&gt;
		txt.TrimLeft();&lt;br /&gt;
&lt;br /&gt;
		CString csFullExeName=txt;&lt;br /&gt;
&lt;br /&gt;
		//берём откуда то уже скачанный файл обновления&lt;br /&gt;
		//...&lt;br /&gt;
		CString csFull_Downloaded_ExeName=def_exeNAMEdnld;&lt;br /&gt;
&lt;br /&gt;
		//копируем файл (обновляем старый то есть)&lt;br /&gt;
		CopyFile(csFull_Downloaded_ExeName,csFullExeName,0);&lt;br /&gt;
&lt;br /&gt;
		//запускаем обновлённого мученника&lt;br /&gt;
		STARTUPINFO si;&lt;br /&gt;
		PROCESS_INFORMATION pi;&lt;br /&gt;
		ZeroMemory(&amp;amp;si,sizeof(si));&lt;br /&gt;
		si.cb = sizeof(si);&lt;br /&gt;
		ZeroMemory(&amp;amp;pi,sizeof(pi));&lt;br /&gt;
		if(CreateProcess(csFullExeName,0,0,0,0,0,0,0,&amp;amp;si,&amp;amp;pi))&lt;br /&gt;
&lt;br /&gt;
		ExitFromMyApp();&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
	//...&lt;br /&gt;
	//...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Есть строка символов (страничка из Инета) в кодировке utf-8 (строка char*). Как мне ее получить в формате String&lt;br /&gt;
или в char* в кодировке ANSI (cp 1251) ?===&lt;br /&gt;
Можно перевести строку из UTF8 в Unicode, затем из Unicode в 1251&lt;br /&gt;
&lt;br /&gt;
Ниже приведена структура, содержащая процедуры перекодирования,&lt;br /&gt;
а также процедуру с примером использования&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//описание структуры&lt;br /&gt;
struct coder&lt;br /&gt;
{&lt;br /&gt;
	//utf8-&amp;gt;unicode&lt;br /&gt;
	static wchar_t* utf8_to_unicode__dontForgetDeleteArr(const char *utf8_string)&lt;br /&gt;
	{&lt;br /&gt;
		wchar_t* pRes=0;&lt;br /&gt;
		int res_len=0;&lt;br /&gt;
&lt;br /&gt;
		//тест на возможность преобразования&lt;br /&gt;
		res_len=MultiByteToWideChar(CP_UTF8,0,utf8_string,-1,0,0);&lt;br /&gt;
		if(!res_len)return 0;&lt;br /&gt;
&lt;br /&gt;
		//выделяем память&lt;br /&gt;
		pRes = new wchar_t[res_len];&lt;br /&gt;
		if(!pRes)return 0;&lt;br /&gt;
&lt;br /&gt;
		//преобразование&lt;br /&gt;
		if(!MultiByteToWideChar(CP_UTF8,0,utf8_string,-1,pRes,res_len))&lt;br /&gt;
		{&lt;br /&gt;
			delete [] pRes;&lt;br /&gt;
			return 0;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		return pRes;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	//unicode-&amp;gt;1251&lt;br /&gt;
	static char * unicode_to_1251__dontForgetDeleteArr(const wchar_t *unicode_string)&lt;br /&gt;
	{&lt;br /&gt;
		char* pRes=0;&lt;br /&gt;
		int res_len=0;&lt;br /&gt;
&lt;br /&gt;
		//тест на возможность преобразования&lt;br /&gt;
		res_len = WideCharToMultiByte(1251,0,unicode_string,-1,0,0,0,0);&lt;br /&gt;
		if(!res_len)return 0;&lt;br /&gt;
&lt;br /&gt;
		//выделяем память&lt;br /&gt;
		pRes=new char[res_len];&lt;br /&gt;
		if(!pRes)return 0;&lt;br /&gt;
&lt;br /&gt;
		//преобразование&lt;br /&gt;
		if(!WideCharToMultiByte(1251,0,unicode_string,-1,pRes,res_len,0,0))&lt;br /&gt;
		{&lt;br /&gt;
			delete [] pRes;&lt;br /&gt;
			return 0;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		return pRes;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	//процедура с примером&lt;br /&gt;
	static void Example()&lt;br /&gt;
	{&lt;br /&gt;
		wchar_t* unicode_string=0;&lt;br /&gt;
		char* cp1251_string=0;&lt;br /&gt;
&lt;br /&gt;
		//исходный текст&lt;br /&gt;
		char utf8_string[] = &amp;quot;UTF-8 + СЂСѓСЃСЃРєРёР№ С‚РµРєСЃС‚&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
		for(;;)&lt;br /&gt;
		{&lt;br /&gt;
&lt;br /&gt;
			unicode_string=utf8_to_unicode__dontForgetDeleteArr(utf8_string);&lt;br /&gt;
			if(!unicode_string)&lt;br /&gt;
			{&lt;br /&gt;
				AfxMessageBox(&amp;quot;Не удалось конвертировать в unicode!&amp;quot;);&lt;br /&gt;
				break;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			cp1251_string = unicode_to_1251__dontForgetDeleteArr(unicode_string);&lt;br /&gt;
&lt;br /&gt;
			if(!cp1251_string)&lt;br /&gt;
			{&lt;br /&gt;
				AfxMessageBox(&amp;quot;Не удалось конвертировать из unicode!&amp;quot;);&lt;br /&gt;
				break;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			break;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		//cp1251_string - результат&lt;br /&gt;
		AfxMessageBox(cp1251_string);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
		//не забываем удалить массивы&lt;br /&gt;
		if(unicode_string)&lt;br /&gt;
		{&lt;br /&gt;
			delete [] unicode_string;&lt;br /&gt;
			unicode_string=0;&lt;br /&gt;
		}&lt;br /&gt;
		if(cp1251_string)&lt;br /&gt;
		{&lt;br /&gt;
			delete [] cp1251_string;&lt;br /&gt;
			cp1251_string=0;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
//вызов примера&lt;br /&gt;
coder::Example();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как организовать взаимодействие программы на VC.net с Access-овской базой данных?===&lt;br /&gt;
Проще всего подключить ADO компоненты и сделать все на них.&lt;br /&gt;
Компоненты  ADO (ADODC,DATAGRID и т.п.) это ActiveX.&lt;br /&gt;
В редакторе ресурсов, во всплывающем меню, есть Insert ActiveX Control -&amp;gt; открывается список всех компоент,&lt;br /&gt;
зарегистрированых на машине. Нужно найти компоненты (Это компоненты от MS и они помечены (OLEDB)) и вставить их в диалог. Для того что бы иметь возможность управлять ими, нужно импортировать обертки для них, это делается при помощи ClassWisard, там есть импорт-&amp;gt;класс-&amp;gt;указать файл с компоентой (OSX).&lt;br /&gt;
Появляется список всех классов, объявленых внутри.&lt;br /&gt;
Проставляем галочки, нажимаем ОК.&lt;br /&gt;
&lt;br /&gt;
[[Category:FAQ]]&lt;/div&gt;</summary>
		<author><name>Mczim</name></author>	</entry>

	<entry>
		<id>https://wiki.shelek.ru/index.php?title=FAQ:WinAPI,_VCPP_Part_3&amp;diff=410</id>
		<title>FAQ:WinAPI, VCPP Part 3</title>
		<link rel="alternate" type="text/html" href="https://wiki.shelek.ru/index.php?title=FAQ:WinAPI,_VCPP_Part_3&amp;diff=410"/>
				<updated>2008-08-14T18:43:12Z</updated>
		
		<summary type="html">&lt;p&gt;Mczim: пробел перед знаком вопроса в заголовке + убраны пробелмы перед запятой и закрывающей скобкой&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Имеется приложение на основе CRichEditView. Как узнать, что пользователь меняет текст?===&lt;br /&gt;
Добавить обработчик сообщения EN_CHANGE. Сообщение генерируется CRichEditView каждый раз, когда пользователь изменяет текст в окне CRichEditView&lt;br /&gt;
===Чем метод CArray::GetSize отличается от метода CArray::GetCount?===&lt;br /&gt;
Абсолютно ничем. (Скорее всего, были предыдущие библиотеки, в которых функции, одинаковые по смыслу, имели разные имена. Поэтому в целях совместимости оставили оба)&lt;br /&gt;
===Как загрузить строку из ресурса?===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CString m_Temp;&lt;br /&gt;
m_Temp.LoadString(ID_MYSTRING);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как поменять иконку у элемента (item) в CListCtrl?===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//заполняем структуру LVITEM&lt;br /&gt;
LVITEM lvItem;&lt;br /&gt;
memset(&amp;amp;lvItem,0,sizeof(lvItem));&lt;br /&gt;
	&lt;br /&gt;
lvItem.mask = LVIF_IMAGE;//меняться будет картинка&lt;br /&gt;
lvItem.iItem = ...;// индекс элемента списка (Zero-based)&lt;br /&gt;
lvItem.iSubItem = 0;&lt;br /&gt;
lvItem.iImage = ...; //индекс иконки (из списка контрола)&lt;br /&gt;
	&lt;br /&gt;
pList-&amp;gt;SetItem(&amp;amp; lvItem);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Имеется класс Class1, содержащий мембер типа указатель на Class2. В Class2 также имеется указатель на Class1. Компилятор выдаёт ошибку. Что надо делать?===&lt;br /&gt;
Предварительно объявляем класс Class2. Тогда компилятору будет известно, что описание класса Class2 будет встречено дальше, и станет возможным объявление указателей на класс до описания самого класса.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Class2;//предопределение&lt;br /&gt;
	&lt;br /&gt;
Class1&lt;br /&gt;
{&lt;br /&gt;
	Class2* p;&lt;br /&gt;
};&lt;br /&gt;
	&lt;br /&gt;
Class2&lt;br /&gt;
{&lt;br /&gt;
	Class1* p;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как переключить раскладку в другом (то есть в активном) процессе?===&lt;br /&gt;
Использовать функции:&lt;br /&gt;
   GetKeyboardLayout - определить текущую раскладку&lt;br /&gt;
   LoadKeyboardLayout - загрузить новую раскладку&lt;br /&gt;
&lt;br /&gt;
см.также&lt;br /&gt;
   VerLanguageName - получить строку с описанием языка&lt;br /&gt;
&lt;br /&gt;
(подробности - в MSDN)&lt;br /&gt;
===Как получить хендл контрола Edit зная его ID?===&lt;br /&gt;
Пусть контрол лежит на окне CMyWnd&lt;br /&gt;
Тогда:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void CMyWnd::некая_процедура()&lt;br /&gt;
{&lt;br /&gt;
	//для MFC&lt;br /&gt;
	CEdit* ed=(CEdit* ) GetDlgItem(ID_EDIT1);&lt;br /&gt;
	HWND hwnd=ed-&amp;gt;GetSafeHwnd();&lt;br /&gt;
	...&lt;br /&gt;
	&lt;br /&gt;
	//для Win32 API&lt;br /&gt;
	HWND hwnd=GetDlgItem(m_hWnd,ID_EDIT1);&lt;br /&gt;
	...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Как из дочернего окна закрыть приложение?===&lt;br /&gt;
Нужно послать родительскому окну (*pParent) сообщение WM_CLOSE:&lt;br /&gt;
 pParent-&amp;gt;PostMessage(WM_CLOSE);//MFC&lt;br /&gt;
или&lt;br /&gt;
 ::PostMessage(pParent-&amp;gt;m_hWnd,WM_CLOSE,(WPARAM)0,(LPARAM)0);//API&lt;br /&gt;
===Как корректно перевести BSTR в CString и наоборот?===&lt;br /&gt;
Нужно просто присвоить переменной типа CString переменную типа BSTR.&lt;br /&gt;
Оператор = класса CString сам всё переведёт.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//указатель на будущий буфер с BSTR.&lt;br /&gt;
//	(По сути, BSTR определён как &lt;br /&gt;
//	typedef WCHAR* BSTR;&lt;br /&gt;
//	то есть указатель на 16-битный символ юникод)&lt;br /&gt;
	&lt;br /&gt;
BSTR bstrHE=0;&lt;br /&gt;
	&lt;br /&gt;
CString Str=&amp;quot;мой текст&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
//Выделить память и загрузить адрес блока в bstrHE&lt;br /&gt;
bstrHE=Str.AllocSysString();&lt;br /&gt;
	&lt;br /&gt;
//...	&lt;br /&gt;
//тут работаем с bstrHE[]&lt;br /&gt;
//...&lt;br /&gt;
	&lt;br /&gt;
//освобождаем память&lt;br /&gt;
SysFreeString(bstrHE);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Как получить доступ к графическим ресурсам элементов текущей темы оформления Windows?===&lt;br /&gt;
Использовать функции&lt;br /&gt;
&lt;br /&gt;
OpenThemeData()&lt;br /&gt;
DrawThemeBackground()&lt;br /&gt;
DrawFrameControl()&lt;br /&gt;
CloseThemeData().&lt;br /&gt;
&lt;br /&gt;
(подробности - в MSDN)&lt;br /&gt;
===Имеется класс , производный от CDialog. Когда диалог в фокусе, нажатие на Enter или Esc приводит к закрытию диалога. Как это запретить?===&lt;br /&gt;
При нажатии Enter происходит выполнение команды IDOK,&lt;br /&gt;
при нажатии Esc - IDCANCEL.&lt;br /&gt;
Нужно переопределить в классе виртуальные функции OnOk() и OnCancel(),&lt;br /&gt;
которые соответственно вызываются для этих команд. При помощи&lt;br /&gt;
визарда эти функции добавить можно так: Положить на диалог две кнопки&lt;br /&gt;
с идентификаторами IDOK и IDCANCEL (при создании нового диалога они там&lt;br /&gt;
есть сразу), затем двойной клик по кнопке добавляет соответствующий&lt;br /&gt;
обработчик. В обработчиках надо удалить вызовы СDialog::OnOK() и&lt;br /&gt;
CDialog::OnCancel(), тогда диалог закрываться не будет.&lt;br /&gt;
Однако тогда диалог станет невозможно закрыть кнопкой с крестиком  :)&lt;br /&gt;
&lt;br /&gt;
Лечить так: добавить обработчик сообщения WM_CLOSE - OnClose(), и в нём&lt;br /&gt;
сделать вызов OnOk() или OnCancel() :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void CPlayersPropsDialog::OnClose() &lt;br /&gt;
{&lt;br /&gt;
	CDialog::OnClose();&lt;br /&gt;
	CDialog::OnCancel();//добавлено&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===VC++6. Я написал простейший макрос, а компилятор на него ругается. Ума не приложу, что за глюк?===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	#define my_macr(x,y,z) \&lt;br /&gt;
		z=\&lt;br /&gt;
		(x+y)*\&lt;br /&gt;
		(x-y)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Скорее всего после одного из символов соединения строк &amp;quot;\&amp;quot; имеется&lt;br /&gt;
пробел или табуляция. Их надо удалить. Можно найти их &amp;quot;наощупь&amp;quot;, а&lt;br /&gt;
можно включить показ непечатных символов в студии. Найти эту команду&lt;br /&gt;
можно так:&lt;br /&gt;
Tools-&amp;gt;Customize...-&amp;gt;вкладка Commands. В окошке Category выбрать&lt;br /&gt;
&amp;quot;Edit&amp;quot;, и среди кнопок справа найти кнопку, на которой написано &amp;quot;a.b&amp;quot;&lt;br /&gt;
Эту кнопку надо перетащить на одну из панелей инструментов студии.&lt;br /&gt;
&lt;br /&gt;
===Как получить список всех процесов, включая idle?===&lt;br /&gt;
Использовать функции&lt;br /&gt;
Process32First()&lt;br /&gt;
Precess32Next()&lt;br /&gt;
&lt;br /&gt;
===Как программно установить переменные окружения?===&lt;br /&gt;
Чтобы добавить или изменить их программно, необходимо воспользоваться&lt;br /&gt;
ключом реестра HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\&lt;br /&gt;
Session Manager\Environment, а затем отправить широковещательное&lt;br /&gt;
сообщение WM_SETTINGCHANGE. Это позволит приложениям узнать об&lt;br /&gt;
изменениях:&lt;br /&gt;
&lt;br /&gt;
::SendMessage(HWND_BROADCAST,WM_SETTINGCHANGE,0,0);&lt;br /&gt;
===Как сделать, чтобы у окна был черный фон?===&lt;br /&gt;
переопределить обработчик сообщения WM_CTLCOLOR - OnCtlColor() :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CBrush br(RGB(0,0,0));&lt;br /&gt;
	&lt;br /&gt;
HBRUSH CMyDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) &lt;br /&gt;
{&lt;br /&gt;
	HBRUSH hbr = CMyDlg::OnCtlColor(pDC, pWnd, nCtlColor);&lt;br /&gt;
	&lt;br /&gt;
	//фон диалога (или вьюшки)&lt;br /&gt;
	if(nCtlColor==CTLCOLOR_DLG)&lt;br /&gt;
	{&lt;br /&gt;
		return (HBRUSH)br;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	//фон статиков (если нужно)&lt;br /&gt;
	if(nCtlColor==CTLCOLOR_STATIC)&lt;br /&gt;
	{&lt;br /&gt;
		//делаем фон текста статика прозрачным&lt;br /&gt;
		pDC-&amp;gt;SetBkMode(TRANSPARENT);&lt;br /&gt;
		return (HBRUSH)br;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	return hbr;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Почему на моем компьютере экзешник, созданный в MFC запускается, а на других компьютерах - нет? Требует какую-то  dll-ку.===&lt;br /&gt;
Нужно выбирать режим Release :&lt;br /&gt;
&lt;br /&gt;
Menu-&amp;gt;Build-&amp;gt;Configurations...-&amp;gt;Release,&lt;br /&gt;
&lt;br /&gt;
и экзешник, соответственно, брать из папки Release проекта&lt;br /&gt;
===Как в диалог добавить меню?===&lt;br /&gt;
Надо сделать в ресурсах меню, затем вставить в диалог:&lt;br /&gt;
&lt;br /&gt;
открыть в редакторе диалог, в свойствах (во вкладке General, окошко Menu) указать идентивикатор ресурса меню.&lt;br /&gt;
При помощи визарда добавить для меню обработчики OnCommand() и OnUpdateСommand().&lt;br /&gt;
===Я добавил визардом меню в диалог. Добавил обработчики для пунктов меню. Пункты работают, но OnUpdate для пунктов не вызывается - то есть не получается ни затенить, ни чек поставить. Что делать?===&lt;br /&gt;
В диалоге у меню апдейта не происходит сам, в отличие от мейнфрейма.&lt;br /&gt;
Для этого нужно сделать самим апдейт в обработчике сообщения WM_KICKIDLE.&lt;br /&gt;
Визардом обработчик не добавляется, поэтому можно переопределить виртуальную DefWindowProc() и там обработать:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;afxpriv.h&amp;gt;	//этот файл надо включить, там определёна WM_KICKIDLE&lt;br /&gt;
&lt;br /&gt;
LRESULT CMyDialog::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam) &lt;br /&gt;
{&lt;br /&gt;
	if(message==WM_KICKIDLE)&lt;br /&gt;
	{&lt;br /&gt;
		//делаем апдейт для всех пунктов меню&lt;br /&gt;
		CMenu* pMainMenu=GetMenu();&lt;br /&gt;
		if(pMainMenu)&lt;br /&gt;
		{&lt;br /&gt;
			CCmdUI cmdUI;&lt;br /&gt;
			for (UINT n=0; n &amp;lt; pMainMenu-&amp;gt;GetMenuItemCount(); ++n)&lt;br /&gt;
			{&lt;br /&gt;
				CMenu* pSubMenu = pMainMenu-&amp;gt;GetSubMenu(n);&lt;br /&gt;
				if(!pSubMenu)continue;&lt;br /&gt;
	&lt;br /&gt;
				cmdUI.m_nIndexMax = pSubMenu-&amp;gt;GetMenuItemCount();&lt;br /&gt;
				for (UINT i = 0; i &amp;lt; cmdUI.m_nIndexMax;++i)&lt;br /&gt;
				{&lt;br /&gt;
					cmdUI.m_nIndex = i;&lt;br /&gt;
					cmdUI.m_nID = pSubMenu-&amp;gt;GetMenuItemID(i);&lt;br /&gt;
					cmdUI.m_pMenu = pSubMenu;&lt;br /&gt;
					cmdUI.DoUpdate(this, FALSE);&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	return CDialog::DefWindowProc(message, wParam, lParam);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Как на Visual C++ 6.0 в Главном окне отключить системное меню (в левом верхнем углу) и кнопки(в правом верхнем углу)?===&lt;br /&gt;
При создании окна нужно убрать стиль WS_SYSMENU&lt;br /&gt;
(теперь пользователь корректно может закрыть окно только Alt+F4,&lt;br /&gt;
ну или если вы предоставите ему дополнительную возможность сделать это)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пример 1. (для SDI, MDI)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//этот обработчик уже добавлен визардом&lt;br /&gt;
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT&amp;amp; cs)&lt;br /&gt;
{&lt;br /&gt;
	if( !CFrameWnd::PreCreateWindow(cs) )&lt;br /&gt;
		return FALSE;&lt;br /&gt;
	// TODO: Modify the Window class or styles here by modifying&lt;br /&gt;
	//  the CREATESTRUCT cs&lt;br /&gt;
&lt;br /&gt;
	///////////////////////////////&lt;br /&gt;
	//добавленная часть&lt;br /&gt;
	{&lt;br /&gt;
		//убираем стиль&lt;br /&gt;
		cs.style&amp;amp;=~WS_SYSMENU;&lt;br /&gt;
	}&lt;br /&gt;
	///////////////////////////////&lt;br /&gt;
&lt;br /&gt;
	return TRUE;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Пример 2. (для диалога)&lt;br /&gt;
Если диалог описан в ресурсах, то в свойствах диалога убрать галочки&lt;br /&gt;
  &amp;quot;System menu&amp;quot;&lt;br /&gt;
  &amp;quot;Minimize box&amp;quot;&lt;br /&gt;
  &amp;quot;Maximize box&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===Хочу сделать так, чтобы пользователь не мог нажать на кнопку, пока программа не разрешит.===&lt;br /&gt;
Нужно применить метод класса CWnd::EnableWindow(...) для кнопки.&lt;br /&gt;
Значение параметра 0 делает кнопку неактивной, 1 - делает активной.&lt;br /&gt;
(кстати, не только для кнопки можно, а для любого класса, производного&lt;br /&gt;
от класса CWnd)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пример 1. Пусть имеется некий диалог, на нём лежит кнопка c ID == IDC_1.&lt;br /&gt;
в любом месте кода диалога (кроме конструктора и деструктора , хотя, если&lt;br /&gt;
проверить наличие валидного хендла диалога, как в примере, то ничего&lt;br /&gt;
страшного не будет и там)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//делаем кнопку неактивной&lt;br /&gt;
if(m_hWnd)&lt;br /&gt;
{&lt;br /&gt;
	CWnd* pw=0;&lt;br /&gt;
	pw=GetDlgItem(IDC_1);&lt;br /&gt;
	if(pw)pw-&amp;gt;EnableWindow(0);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Что означают сообщения, которые студия выводит при компиляции, вроде таких : Loaded 'C:\WINDOWS\SYSTEM\WSOCK32.DLL', no matching symbolic information found. ===&lt;br /&gt;
Это строка говорит о том, что студия не смогла найти отладочные&lt;br /&gt;
символы для WSOCK32.DLL. В этом нет ничего страшного, просто при наличии&lt;br /&gt;
отладочных символов в процессе отладки можно получить доступ к именам&lt;br /&gt;
функции из системных DLL. Например, вместо&lt;br /&gt;
 KERNEL32! 0x77E8B184() -&lt;br /&gt;
 увидим&lt;br /&gt;
 KERNEL32!CreateThread.&lt;br /&gt;
===Как обработать сообщения , которое приходит к некому контролу (скажем CEdit) ?===&lt;br /&gt;
Нужно произвести от CEdit свой класс, и в виртуальной процедуре класса WindowProc перехватить нужные сообщения.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
virtual LRESULT WindowProc(&lt;br /&gt;
   UINT message,&lt;br /&gt;
   WPARAM wParam,&lt;br /&gt;
   LPARAM lParam &lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Пример. Полностью выключаем, скажем, обработку сообщения WM_CHAR&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	LRESULT CMyEdit::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) &lt;br /&gt;
	{&lt;br /&gt;
		switch(message)&lt;br /&gt;
		{&lt;br /&gt;
			case WM_CHAR:&lt;br /&gt;
			{&lt;br /&gt;
				return 0;&lt;br /&gt;
			}&lt;br /&gt;
			break;&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		return CEdit::WindowProc(message, wParam, lParam);&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Чтобы связать экземпляр класса с контролом на форме, добавьте визардом для&lt;br /&gt;
контрола переменную класса (выбрав не Value а Control).&lt;br /&gt;
===Как настроить количество пробелов в табуляции?===&lt;br /&gt;
Tools-&amp;gt;Options-&amp;gt;Tabs-&amp;gt;Insert Spaces&lt;br /&gt;
(или  правой кнопкой мыши по тексту-&amp;gt; properties)&lt;br /&gt;
===Как автоматически расставить отступы?===&lt;br /&gt;
Выделить текст для форматирования, нажать Alt+F8&lt;br /&gt;
&lt;br /&gt;
Есть ещё программа Artistic Style, которая занимается&lt;br /&gt;
переформатированием кода&lt;br /&gt;
http://sourceforge.net/projects/astyle/&lt;br /&gt;
===Поиск границ блока===&lt;br /&gt;
&amp;quot;CTRL+ }&amp;quot; ищет парную фигурную скобку в тексте и переходит на неё&lt;br /&gt;
===Вертикальное выделение текста===&lt;br /&gt;
&amp;quot;Alt + выделение мышкой&amp;quot; - позволяет выделять вертикальные фрагменты текста&lt;br /&gt;
===Как узнать количество установленных в CListCtrl столбцов ?===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CListCtrl* pL=...; //указатель на переменную-контрол&lt;br /&gt;
&lt;br /&gt;
int count=pL-&amp;gt;GetHeaderCtrl()-&amp;gt;GetItemCount();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как получить иконку приложения?===&lt;br /&gt;
Если приложение запущено, то нужно найти его главное окно и&lt;br /&gt;
послать ему сообщение WM_GETICON.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//функция возвращант хендл иконки &lt;br /&gt;
LRESULT SendMessage(hWnd, WM_GETICON, wParam, 0);&lt;br /&gt;
&lt;br /&gt;
//hWnd == хендл окна приложения&lt;br /&gt;
//wParam == &lt;br /&gt;
//	1)==ICON_BIG - получить большую иконку&lt;br /&gt;
//	2)==ICON_SMALL - получить маленькую иконку&lt;br /&gt;
//	3)==ICON_SMALL2 - получить маленькую иконку, если она определена&lt;br /&gt;
//				в приложении. Если её нет, то маленькую иконку, &lt;br /&gt;
//				сгенерированную системой из большой иконки&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как в CString можно найти или вырезать часть строки?===&lt;br /&gt;
есть такие методы в CString :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//вырезает кусок строки&lt;br /&gt;
CString Mid(int nFirst) const;&lt;br /&gt;
CString Mid(int nFirst,  int nCount) const;&lt;br /&gt;
&lt;br /&gt;
//возвращает кусок строки (сначала или с конца)&lt;br /&gt;
CString Left(int nCount ) const;&lt;br /&gt;
CString Right(int nCount ) const;&lt;br /&gt;
&lt;br /&gt;
//возвращает начальный кусок строки, в котором есть только&lt;br /&gt;
//символы из набора,представленного в lpszCharSet&lt;br /&gt;
CString SpanIncluding(LPCTSTR lpszCharSet ) const;&lt;br /&gt;
&lt;br /&gt;
//возвращает начальный кусок строки, в котором нет&lt;br /&gt;
//символов из набора,представленного в lpszCharSet&lt;br /&gt;
CString SpanExcluding(LPCTSTR lpszCharSet ) const; &lt;br /&gt;
&lt;br /&gt;
//убирает &amp;quot;пробелоподобные&amp;quot; символы из самого начала строки&lt;br /&gt;
//(то есть - пробел, табуляцию (\t) , возврат каретки, перевод строки (/r/n))&lt;br /&gt;
void TrimLeft();&lt;br /&gt;
//убирает все повторы символа из самого начала строки&lt;br /&gt;
void TrimLeft(TCHAR chTarget );&lt;br /&gt;
//убирает из самого начала строки все символа из набора lpszTargets &lt;br /&gt;
void TrimLeft(LPCTSTR lpszTargets ); &lt;br /&gt;
&lt;br /&gt;
void TrimRight();&lt;br /&gt;
void TrimRight(TCHAR chTarget );&lt;br /&gt;
void TrimRight(LPCTSTR lpszTargets ); &lt;br /&gt;
&lt;br /&gt;
//поиск в строке&lt;br /&gt;
int Find( TCHAR ch ) const;&lt;br /&gt;
int Find( LPCTSTR lpszSub ) const;&lt;br /&gt;
int Find( TCHAR ch, int nStart ) const;&lt;br /&gt;
int Find( LPCTSTR pstr, int nStart ) const;&lt;br /&gt;
&lt;br /&gt;
//поиск, начиная с конца&lt;br /&gt;
int ReverseFind( TCHAR ch ) const;&lt;br /&gt;
&lt;br /&gt;
//поиск позиции первого символа, одного из набора,&lt;br /&gt;
// представленного в lpszCharSet&lt;br /&gt;
int FindOneOf( LPCTSTR lpszCharSet ) const;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Есть у меня CListBox и я в ходе выполнения программы добавляю в него строки. Но я не могу посмотреть что именно добавляется. Вывод результатов происходит в конце выполнения процедуры...===&lt;br /&gt;
Если нужно делать принудительную перерисовку окна во время&lt;br /&gt;
длительных вычислений, то нужно вызывать для окна, которое&lt;br /&gt;
надо перерисовать метод&lt;br /&gt;
  RedrawWindow()&lt;br /&gt;
с параметрами по умолчанию, или пару&lt;br /&gt;
  Invalidate(0);&lt;br /&gt;
  UpdateWindow();&lt;br /&gt;
Это приводит к пометке всего окна к перерисовке и отправлению&lt;br /&gt;
сообщения WM_PAINT в оконную процедуру в обход очереди&lt;br /&gt;
сообщений, вызывая немедленную перерисовку окна.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CWnd* pw=...;//окно , которое надо перерисовывать&lt;br /&gt;
&lt;br /&gt;
for(int i=0;i&amp;lt;10000)&lt;br /&gt;
{&lt;br /&gt;
	//меняется содержимое окна&lt;br /&gt;
	//...&lt;br /&gt;
&lt;br /&gt;
	//немедленная перерисовка&lt;br /&gt;
	pw-&amp;gt;Invalidate(0);&lt;br /&gt;
	pw-&amp;gt;UpdateWindow();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Я написал DLL , которую используют несколько приложений. Всё вроде работает, но когда происходит очередной вызов функции из DLL , почему то данные в функции обнуляются. С чем это связано ?===&lt;br /&gt;
Переменные и массивы в DLL, содержимое которых должно использоваться несколькими процессами, должны объявляться статическими. Статическая переменная или массив инициализируются только один раз в момент загрузки DLL.&lt;br /&gt;
Пример:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DWORD calltest()&lt;br /&gt;
{&lt;br /&gt;
	//будет выполнено только при первом вызове&lt;br /&gt;
	static DWORD callcount=0;&lt;br /&gt;
	static DWORD str[1000]={0}; &lt;br /&gt;
&lt;br /&gt;
	//будет выполняться каждый раз&lt;br /&gt;
	return ++callcount;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как открыть проекцию файла в память и как с ней работать?===&lt;br /&gt;
Как открыть проекцию файла в память и как с ней работать?&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HANDLE CreateFileMapping(&lt;br /&gt;
  HANDLE hFile,	//хендл уже открытого файла&lt;br /&gt;
  LPSECURITY_ATTRIBUTES lpAttributes,&lt;br /&gt;
  DWORD flProtect,	//способ открытия проекции&lt;br /&gt;
  DWORD dwMaximumSizeHigh,	//размер файла (старшие 4 байта , обычно==0)&lt;br /&gt;
  DWORD dwMaximumSizeLow,	//размер файла (младшие 4 байта)&lt;br /&gt;
  LPCTSTR lpName&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Доступ к созданной проекции производится процедурой&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LPVOID MapViewOfFile(&lt;br /&gt;
  HANDLE hFileMappingObject, //хендл проекции&lt;br /&gt;
  DWORD dwDesiredAccess,	//способ работы с проекцией&lt;br /&gt;
  DWORD dwFileOffsetHigh,&lt;br /&gt;
  DWORD dwFileOffsetLow, //смещение от начала файла (младшие 4 байта)&lt;br /&gt;
  SIZE_T dwNumberOfBytesToMap //длина в байтах (если ==0 - то весь файл)&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
далее с файлом можно работать как с обычным массивом в памяти.&lt;br /&gt;
&lt;br /&gt;
После работы с проекцией , её надо освободить процедурой&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
BOOL UnmapViewOfFile(&lt;br /&gt;
  LPCVOID lpBaseAddress //адрес, который вернула процедура MapViewOfFile&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Пример.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HANDLE hMapFile=0;//для проекции&lt;br /&gt;
&lt;br /&gt;
HANDLE hFile=...;//хендл уже открытого файла&lt;br /&gt;
DWORD dwdFileLen=...;//размер открытого файла&lt;br /&gt;
&lt;br /&gt;
//создаём проекцию &amp;quot;только для чтения&amp;quot;&lt;br /&gt;
hMapFile=::CreateFileMapping(hFile,0,PAGE_READONLY,0,dwdFileLen,0);&lt;br /&gt;
&lt;br /&gt;
//хендл hFile можно закрыть уже здесь, в принципе,&lt;br /&gt;
//но мы сделаем это позже&lt;br /&gt;
&lt;br /&gt;
//получаем доступ к проекции (тоже только для чтения)&lt;br /&gt;
BYTE* pbyFile=(BYTE*)::MapViewOfFile(hMapFile,FILE_MAP_READ,0,0,0);&lt;br /&gt;
&lt;br /&gt;
///////////////////&lt;br /&gt;
//тут работаем с массивом pbyFile[dwdFileLen] как с обычным,&lt;br /&gt;
//только не забываем, что он открыт только для чтения&lt;br /&gt;
//...&lt;br /&gt;
//...&lt;br /&gt;
//...&lt;br /&gt;
///////////////////&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//отключаем файл данных от адресного пространства&lt;br /&gt;
UnmapViewOfFile(pbyFile);&lt;br /&gt;
&lt;br /&gt;
//освобождаем хендл проекции&lt;br /&gt;
CloseHandle(hMapFile)&lt;br /&gt;
&lt;br /&gt;
//освобождаем хендл открытого файла&lt;br /&gt;
CloseHandle(hFile);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Использую MFC Grid control 2.25 , не получается отобразить картинку в ячейке. Как это делается ?===&lt;br /&gt;
Нужно создать список изображений (CImageList) , затем передать указатель на список в контрол. Поскольку контрол лишь копирует указатель , список должен создаваться динамически, либо быть членом класса, экземпляр которого существует всё время работы контрола.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 m_GridMarket&lt;br /&gt;
CImageList m_ImageList;&lt;br /&gt;
CGridCtrL m_Grid1&lt;br /&gt;
...&lt;br /&gt;
...&lt;br /&gt;
//неким образом создаётся список&lt;br /&gt;
m_ImageList.Create(...);&lt;br /&gt;
//...&lt;br /&gt;
&lt;br /&gt;
//вставляем в контрол&lt;br /&gt;
m_Grid1.SetImageList(&amp;amp;m_ImageList);&lt;br /&gt;
&lt;br /&gt;
//&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как при помощи IPicture отобразить картинку из файла? ===&lt;br /&gt;
Пример - несложная функция, отображающая картинку из файла&lt;br /&gt;
&lt;br /&gt;
поддерживаются форматы&lt;br /&gt;
BMP, GIF, JPEG, PNG, TIFF, EMF&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;quot;atlconv.h&amp;quot;&lt;br /&gt;
#define HandleIsValid(H) (H!=(HANDLE)-1 &amp;amp;&amp;amp; H!=(HANDLE)0)&lt;br /&gt;
&lt;br /&gt;
//*pDestDC - CDC, на который предполагается вывод картинки&lt;br /&gt;
//pchzFilePath - путь к файлу&lt;br /&gt;
//pWid - (возвращает) ширина картинки&lt;br /&gt;
//pHig - (возвращает) высота картинки&lt;br /&gt;
bool DrawBitmapFromFile(CDC* pDestDC,const char* pchzFilePath,int *pWid=0,int *pHig=0)&lt;br /&gt;
{&lt;br /&gt;
	bool result=false;&lt;br /&gt;
&lt;br /&gt;
	if(pWid)*pWid=0;&lt;br /&gt;
	if(pHig)*pHig=0;&lt;br /&gt;
&lt;br /&gt;
	int Wid=0;&lt;br /&gt;
	int Hig=0;&lt;br /&gt;
&lt;br /&gt;
	IPicture* pPic=0;&lt;br /&gt;
	try&lt;br /&gt;
	{&lt;br /&gt;
		IPicture* ptmpPic=0;&lt;br /&gt;
		USES_CONVERSION;&lt;br /&gt;
		HRESULT hr;&lt;br /&gt;
&lt;br /&gt;
		CString txt=pchzFilePath;&lt;br /&gt;
		hr= ::OleLoadPicturePath(&lt;br /&gt;
			const_cast&amp;lt;LPOLESTR&amp;gt;(T2COLE(txt)),&lt;br /&gt;
			0,0,0,IID_IPicture,&lt;br /&gt;
			reinterpret_cast&amp;lt;void **&amp;gt;(&amp;amp;ptmpPic)&lt;br /&gt;
			);&lt;br /&gt;
&lt;br /&gt;
		if(hr==S_OK &amp;amp;&amp;amp; ptmpPic)&lt;br /&gt;
		{&lt;br /&gt;
			pPic=ptmpPic;&lt;br /&gt;
		}&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			throw 0;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		OLE_XPOS_HIMETRIC cxSrc;&lt;br /&gt;
		OLE_YPOS_HIMETRIC cySrc;&lt;br /&gt;
&lt;br /&gt;
		if(S_OK!=pPic-&amp;gt;get_Width(&amp;amp;cxSrc))throw 0;&lt;br /&gt;
		if(S_OK!=pPic-&amp;gt;get_Height(&amp;amp;cySrc))throw 0;&lt;br /&gt;
&lt;br /&gt;
		Wid=cxSrc/26;&lt;br /&gt;
		Hig=cySrc/26;&lt;br /&gt;
&lt;br /&gt;
		//рисуем&lt;br /&gt;
		if(S_OK !=pPic-&amp;gt;Render(pDestDC-&amp;gt;GetSafeHdc(),&lt;br /&gt;
			0,Hig,Wid,-Hig,0,0,cxSrc,cySrc,0))throw 0;&lt;br /&gt;
	}&lt;br /&gt;
	catch(...)&lt;br /&gt;
	{&lt;br /&gt;
		result=false;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if(pPic)&lt;br /&gt;
	{&lt;br /&gt;
		pPic-&amp;gt;Release();&lt;br /&gt;
		pPic=0;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	if(pWid)*pWid=Wid;&lt;br /&gt;
	if(pHig)*pHig=Hig;&lt;br /&gt;
&lt;br /&gt;
	return result;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===У меня модальное диалоговое окно, в нем поле редактирования мультилайновое, т.е. чтобы перейти на новую строку надо нажать ентер, но вызывается стандартный обработчик диалогового окна. Подскажите, что делать?===&lt;br /&gt;
Нужно в редакторе ресурсов поставить для CEdit окошка галочку&lt;br /&gt;
свойства WantReturn,&lt;br /&gt;
&lt;br /&gt;
или добавить ES_WANTRETURN при создании CEdit контрола динамически.&lt;br /&gt;
===Как выводят картинку-логотип(splash screen) при запуске программы? То есть, когда загружается программа на экран выводится картинка, потом она исчезает(загрузка программы закончена) и пользователь может приступать к работе ===&lt;br /&gt;
Для этого используется класс, производный от CDialog. Этот диалог после создания показывает себя на экран, выводя на себя рисунок. Также запускает таймет, по срабатывани которого диалог гасится. Создаётся диалог InitInstance приложения.&lt;br /&gt;
&lt;br /&gt;
В VC6++ также есть уже готовый компонент&lt;br /&gt;
Project-&amp;gt;Add To Project -&amp;gt; Components and Controls-&amp;gt;(в папке &amp;quot;Visual C++ Components&amp;quot; есть SplashScreen.)&lt;br /&gt;
===Как сделать, чтобы при выпадении списка у ComboBox была не одна строка, а больше, вроде все свойства покрутил, не помогает Вместо выпадающего списка одна строка и скролл...===&lt;br /&gt;
В редакторе ресурсов надо щелкнуть в комбобоксе на треугольнике - появляется рамка для растягивания вниз - размер выпадающего списка.&lt;br /&gt;
===В VC++.net , что делать после того, как на форму установил ActiiveX ListView, как объявить класс и переменную для этого элемента?===&lt;br /&gt;
Щёлкнуть правой кнопкой мыши на элементе , в меню - add variable или add class&lt;br /&gt;
===Как вставить данные в буфер обмена (Clipboard) ? Как их оттуда вытащить ?===&lt;br /&gt;
&lt;br /&gt;
1) копирование в буфер обмена:&lt;br /&gt;
&lt;br /&gt;
  1.Готовим данные&lt;br /&gt;
    а.Выделяем память из кучи,  вызывая GlobalAlloc()&lt;br /&gt;
    б.Получаем указатель на выделенную память, вызывая GlobalLock()&lt;br /&gt;
    в.Заполняем данные&lt;br /&gt;
    г.Освобождаем указатель , вызывая GlobalUnlock();&lt;br /&gt;
&lt;br /&gt;
  2.Открываем буфер обмена , вызывая OpenClipboard();&lt;br /&gt;
  3.Очищаем буфер, вызывая EmptyClipboard();&lt;br /&gt;
  4.Вызываем SetClipboardData() один раз для каждого формата&lt;br /&gt;
      вставляемых данных (имеется в виду - если одни и те же&lt;br /&gt;
      данные представлены в разных форматах, и приложение&lt;br /&gt;
      может эти форматы создать)&lt;br /&gt;
  5.Закрываем буфер, вызывая CloseClipboard();&lt;br /&gt;
  6.ВЫЗЫВАТЬ GlobalFree() НЕ НУЖНО , в этом случае это&lt;br /&gt;
      предоставлено системе&lt;br /&gt;
&lt;br /&gt;
Скажем, хотим поместить в буфер обмена туда текст.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	//готовим данные&lt;br /&gt;
	//выделяем из кучи память для данных&lt;br /&gt;
	HANDLE hglbCopy = GlobalAlloc(GMEM_MOVEABLE,10);&lt;br /&gt;
	if(!hglbCopy)return;&lt;br /&gt;
&lt;br /&gt;
	//получаем указатель&lt;br /&gt;
	void* lpStr = GlobalLock(hglbCopy);&lt;br /&gt;
	if(!lpStr)return;&lt;br /&gt;
&lt;br /&gt;
	//заполняем данные&lt;br /&gt;
	strcpy((char*)lpStr,&amp;quot;my text&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	//освобождаем указатель&lt;br /&gt;
	GlobalUnlock(hglbCopy);&lt;br /&gt;
	lpStr=0;&lt;br /&gt;
&lt;br /&gt;
	//открываем буфер обмена&lt;br /&gt;
	OpenClipboard();&lt;br /&gt;
	//очищаем&lt;br /&gt;
	EmptyClipboard();&lt;br /&gt;
&lt;br /&gt;
	//текстовый формат&lt;br /&gt;
	SetClipboardData(CF_TEXT,hglbCopy);&lt;br /&gt;
&lt;br /&gt;
	//закрываем буфер&lt;br /&gt;
	CloseClipboard();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
2) извлечение из буфера обмена&lt;br /&gt;
&lt;br /&gt;
  1.Проверяем, что поддерживается нужный формат данных,&lt;br /&gt;
      вызывая IsClipboardFormatAvailable()&lt;br /&gt;
  2.Открываем буфер обмена , вызывая OpenClipboard();&lt;br /&gt;
  3.Достаём данные&lt;br /&gt;
   а.Получаем из буфера хендл требуемого формата,&lt;br /&gt;
      вызывая GetClipboardData()&lt;br /&gt;
    б.Получаем указатель на выделенную память, вызывая GlobalLock()&lt;br /&gt;
    в.Работаем с данными&lt;br /&gt;
    г.Освобождаем указатель , вызывая GlobalUnlock();&lt;br /&gt;
  4.Закрываем буфер, вызывая CloseClipboard();&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	//Проверяем, что поддерживается нужный формат данных,&lt;br /&gt;
	if(!IsClipboardFormatAvailable(CF_TEXT))return;&lt;br /&gt;
&lt;br /&gt;
	//открываем буфер обмена&lt;br /&gt;
	OpenClipboard();&lt;br /&gt;
&lt;br /&gt;
	//достаём данные&lt;br /&gt;
&lt;br /&gt;
	//текстовый формат&lt;br /&gt;
	HANDLE hglbCopy = GetClipboardData(CF_TEXT);&lt;br /&gt;
	if(!hglbCopy)return;&lt;br /&gt;
&lt;br /&gt;
	//получаем указатель&lt;br /&gt;
	void* lpStr = GlobalLock(hglbCopy);&lt;br /&gt;
	if(!lpStr)return;&lt;br /&gt;
&lt;br /&gt;
	//читаем данные&lt;br /&gt;
	char data[10];&lt;br /&gt;
	memmove(data,lpStr,sizeof(data));&lt;br /&gt;
&lt;br /&gt;
	//освобождаем указатель&lt;br /&gt;
	GlobalUnlock(hglbCopy);&lt;br /&gt;
	lpStr=0;&lt;br /&gt;
&lt;br /&gt;
	//закрываем буфер&lt;br /&gt;
	CloseClipboard();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как получить полный путь к экзешнику из самой программы ?===&lt;br /&gt;
В командную строку первым параметром система всегда передаёт заключённый в кавычки полный путь к файлу запущенной программы Достаём путь таким образом :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
BOOL CMyApp::InitInstance()&lt;br /&gt;
{&lt;br /&gt;
	//добыча полного имени экзешника&lt;br /&gt;
	CString csFullExeName;&lt;br /&gt;
	{&lt;br /&gt;
		CString csAppName=GetCommandLine();&lt;br /&gt;
		csAppName.Delete(0,1);&lt;br /&gt;
		csAppName.Replace('\&amp;quot;','\0');&lt;br /&gt;
		csFullExeName=(const char*)csAppName;&lt;br /&gt;
	}&lt;br /&gt;
	//теперь csFullExeName - содержит искомый путь&lt;br /&gt;
&lt;br /&gt;
	//...&lt;br /&gt;
	//...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Каким способом можно exe файл может заменить самого себя? То есть, моя программа обновляется, например, через Internet, и хочет обновить свой exe-файл. Но так как он в данный момент запущен - это будет, естественно, запрещено. Как это можно проще всего сделать?===&lt;br /&gt;
Один из способов - сделать копию экзешника и из него обновиться&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define def_exeNAMEup	&amp;quot;c:\\myprog_update.exe&amp;quot;&lt;br /&gt;
#define def_exeNAMEdnld	&amp;quot;c:\\myprog_downloaded.exe&amp;quot;&lt;br /&gt;
#define def_keyUdate	&amp;quot;/update&amp;quot;&lt;br /&gt;
&lt;br /&gt;
void CTESTFAQApp::UpdateItself()&lt;br /&gt;
{&lt;br /&gt;
	//добыча полного имени экзешника&lt;br /&gt;
	CString csFullExeName;&lt;br /&gt;
	{&lt;br /&gt;
		CString csAppName=GetCommandLine();&lt;br /&gt;
		csAppName.Delete(0,1);&lt;br /&gt;
		csAppName.Replace('\&amp;quot;','\0');&lt;br /&gt;
		csFullExeName=(const char*)csAppName;&lt;br /&gt;
	}&lt;br /&gt;
	//теперь csFullExeName - содержит искомый путь&lt;br /&gt;
&lt;br /&gt;
	//делаем копию экзешника с другим именем&lt;br /&gt;
	CopyFile(csFullExeName,def_exeNAMEup,0);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	//передаём в параметры нового процесса ключ и путь к текущему файлу&lt;br /&gt;
	CString csParams=def_keyUdate;&lt;br /&gt;
	csParams+=&amp;quot; &amp;quot;;&lt;br /&gt;
	csParams+=csFullExeName;&lt;br /&gt;
&lt;br /&gt;
	//запускаем копию&lt;br /&gt;
	STARTUPINFO si;&lt;br /&gt;
	PROCESS_INFORMATION pi;&lt;br /&gt;
	ZeroMemory(&amp;amp;si,sizeof(si));&lt;br /&gt;
	si.cb = sizeof(si);&lt;br /&gt;
	ZeroMemory(&amp;amp;pi,sizeof(pi));&lt;br /&gt;
	if(CreateProcess(def_exeNAMEup,def_keyUdate,0,0,0,0,0,0,&amp;amp;si,&amp;amp;pi))&lt;br /&gt;
	{&lt;br /&gt;
		//завершаем текущий процесс&lt;br /&gt;
		ExitFromMyApp();&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void CTESTFAQApp::ExitFromMyApp()&lt;br /&gt;
{&lt;br /&gt;
	exit(0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
BOOL CTESTFAQApp::InitInstance()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
	//смотрим, не запустили ли для апдейта?&lt;br /&gt;
&lt;br /&gt;
	CString txt;&lt;br /&gt;
	txt=m_lpCmdLine;&lt;br /&gt;
	if(txt.Find(def_keyUdate)==0)&lt;br /&gt;
	{&lt;br /&gt;
		//делаем айдейт&lt;br /&gt;
		txt.Replace(def_keyUdate,&amp;quot;&amp;quot;);&lt;br /&gt;
		txt.TrimLeft();&lt;br /&gt;
&lt;br /&gt;
		CString csFullExeName=txt;&lt;br /&gt;
&lt;br /&gt;
		//берём откуда то уже скачанный файл обновления&lt;br /&gt;
		//...&lt;br /&gt;
		CString csFull_Downloaded_ExeName=def_exeNAMEdnld;&lt;br /&gt;
&lt;br /&gt;
		//копируем файл (обновляем старый то есть)&lt;br /&gt;
		CopyFile(csFull_Downloaded_ExeName,csFullExeName,0);&lt;br /&gt;
&lt;br /&gt;
		//запускаем обновлённого мученника&lt;br /&gt;
		STARTUPINFO si;&lt;br /&gt;
		PROCESS_INFORMATION pi;&lt;br /&gt;
		ZeroMemory(&amp;amp;si,sizeof(si));&lt;br /&gt;
		si.cb = sizeof(si);&lt;br /&gt;
		ZeroMemory(&amp;amp;pi,sizeof(pi));&lt;br /&gt;
		if(CreateProcess(csFullExeName,0,0,0,0,0,0,0,&amp;amp;si,&amp;amp;pi))&lt;br /&gt;
&lt;br /&gt;
		ExitFromMyApp();&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
	//...&lt;br /&gt;
	//...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Есть строка символов (страничка из Инета) в кодировке utf-8 (строка char*). Как мне ее получить в формате String&lt;br /&gt;
или в char* в кодировке ANSI (cp 1251) ?===&lt;br /&gt;
Можно перевести строку из UTF8 в Unicode, затем из Unicode в 1251&lt;br /&gt;
&lt;br /&gt;
Ниже приведена структура, содержащая процедуры перекодирования,&lt;br /&gt;
а также процедуру с примером использования&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//описание структуры&lt;br /&gt;
struct coder&lt;br /&gt;
{&lt;br /&gt;
	//utf8-&amp;gt;unicode&lt;br /&gt;
	static wchar_t* utf8_to_unicode__dontForgetDeleteArr(const char *utf8_string)&lt;br /&gt;
	{&lt;br /&gt;
		wchar_t* pRes=0;&lt;br /&gt;
		int res_len=0;&lt;br /&gt;
&lt;br /&gt;
		//тест на возможность преобразования&lt;br /&gt;
		res_len=MultiByteToWideChar(CP_UTF8,0,utf8_string,-1,0,0);&lt;br /&gt;
		if(!res_len)return 0;&lt;br /&gt;
&lt;br /&gt;
		//выделяем память&lt;br /&gt;
		pRes = new wchar_t[res_len];&lt;br /&gt;
		if(!pRes)return 0;&lt;br /&gt;
&lt;br /&gt;
		//преобразование&lt;br /&gt;
		if(!MultiByteToWideChar(CP_UTF8,0,utf8_string,-1,pRes,res_len))&lt;br /&gt;
		{&lt;br /&gt;
			delete [] pRes;&lt;br /&gt;
			return 0;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		return pRes;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	//unicode-&amp;gt;1251&lt;br /&gt;
	static char * unicode_to_1251__dontForgetDeleteArr(const wchar_t *unicode_string)&lt;br /&gt;
	{&lt;br /&gt;
		char* pRes=0;&lt;br /&gt;
		int res_len=0;&lt;br /&gt;
&lt;br /&gt;
		//тест на возможность преобразования&lt;br /&gt;
		res_len = WideCharToMultiByte(1251,0,unicode_string,-1,0,0,0,0);&lt;br /&gt;
		if(!res_len)return 0;&lt;br /&gt;
&lt;br /&gt;
		//выделяем память&lt;br /&gt;
		pRes=new char[res_len];&lt;br /&gt;
		if(!pRes)return 0;&lt;br /&gt;
&lt;br /&gt;
		//преобразование&lt;br /&gt;
		if(!WideCharToMultiByte(1251,0,unicode_string,-1,pRes,res_len,0,0))&lt;br /&gt;
		{&lt;br /&gt;
			delete [] pRes;&lt;br /&gt;
			return 0;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		return pRes;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	//процедура с примером&lt;br /&gt;
	static void Example()&lt;br /&gt;
	{&lt;br /&gt;
		wchar_t* unicode_string=0;&lt;br /&gt;
		char* cp1251_string=0;&lt;br /&gt;
&lt;br /&gt;
		//исходный текст&lt;br /&gt;
		char utf8_string[] = &amp;quot;UTF-8 + СЂСѓСЃСЃРєРёР№ С‚РµРєСЃС‚&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
		for(;;)&lt;br /&gt;
		{&lt;br /&gt;
&lt;br /&gt;
			unicode_string=utf8_to_unicode__dontForgetDeleteArr(utf8_string);&lt;br /&gt;
			if(!unicode_string)&lt;br /&gt;
			{&lt;br /&gt;
				AfxMessageBox(&amp;quot;Не удалось конвертировать в unicode!&amp;quot;);&lt;br /&gt;
				break;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			cp1251_string = unicode_to_1251__dontForgetDeleteArr(unicode_string);&lt;br /&gt;
&lt;br /&gt;
			if(!cp1251_string)&lt;br /&gt;
			{&lt;br /&gt;
				AfxMessageBox(&amp;quot;Не удалось конвертировать из unicode!&amp;quot;);&lt;br /&gt;
				break;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			break;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		//cp1251_string - результат&lt;br /&gt;
		AfxMessageBox(cp1251_string);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
		//не забываем удалить массивы&lt;br /&gt;
		if(unicode_string)&lt;br /&gt;
		{&lt;br /&gt;
			delete [] unicode_string;&lt;br /&gt;
			unicode_string=0;&lt;br /&gt;
		}&lt;br /&gt;
		if(cp1251_string)&lt;br /&gt;
		{&lt;br /&gt;
			delete [] cp1251_string;&lt;br /&gt;
			cp1251_string=0;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
//вызов примера&lt;br /&gt;
coder::Example();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как организовать взаимодействие программы на VC.net с Access-овской базой данных?===&lt;br /&gt;
Проще всего подключить ADO компоненты и сделать все на них.&lt;br /&gt;
Компоненты  ADO (ADODC,DATAGRID и т.п.) это ActiveX.&lt;br /&gt;
В редакторе ресурсов, во всплывающем меню, есть Insert ActiveX Control -&amp;gt; открывается список всех компоент,&lt;br /&gt;
зарегистрированых на машине. Нужно найти компоненты (Это компоненты от MS и они помечены (OLEDB)) и вставить их в диалог. Для того что бы иметь возможность управлять ими, нужно импортировать обертки для них, это делается при помощи ClassWisard, там есть импорт-&amp;gt;класс-&amp;gt;указать файл с компоентой (OSX).&lt;br /&gt;
Появляется список всех классов, объявленых внутри.&lt;br /&gt;
Проставляем галочки, нажимаем ОК.&lt;br /&gt;
&lt;br /&gt;
[[Category:FAQ]]&lt;/div&gt;</summary>
		<author><name>Mczim</name></author>	</entry>

	<entry>
		<id>https://wiki.shelek.ru/index.php?title=FAQ:WinAPI,_VCPP_Part_3&amp;diff=409</id>
		<title>FAQ:WinAPI, VCPP Part 3</title>
		<link rel="alternate" type="text/html" href="https://wiki.shelek.ru/index.php?title=FAQ:WinAPI,_VCPP_Part_3&amp;diff=409"/>
				<updated>2008-08-14T18:41:22Z</updated>
		
		<summary type="html">&lt;p&gt;Mczim: для пунктов меню. Но пункты работают, но &amp;gt; для пунктов меню. Пункты работают, но&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Имеется приложение на основе CRichEditView. Как узнать, что пользователь меняет текст?===&lt;br /&gt;
Добавить обработчик сообщения EN_CHANGE. Сообщение генерируется CRichEditView каждый раз, когда пользователь изменяет текст в окне CRichEditView&lt;br /&gt;
===Чем метод CArray::GetSize отличается от метода CArray::GetCount?===&lt;br /&gt;
Абсолютно ничем. (Скорее всего, были предыдущие библиотеки, в которых функции, одинаковые по смыслу, имели разные имена. Поэтому в целях совместимости оставили оба)&lt;br /&gt;
===Как загрузить строку из ресурса?===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CString m_Temp;&lt;br /&gt;
m_Temp.LoadString(ID_MYSTRING);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как поменять иконку у элемента (item) в CListCtrl?===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//заполняем структуру LVITEM&lt;br /&gt;
LVITEM lvItem;&lt;br /&gt;
memset(&amp;amp;lvItem,0,sizeof(lvItem));&lt;br /&gt;
	&lt;br /&gt;
lvItem.mask = LVIF_IMAGE;//меняться будет картинка&lt;br /&gt;
lvItem.iItem = ...;// индекс элемента списка (Zero-based)&lt;br /&gt;
lvItem.iSubItem = 0;&lt;br /&gt;
lvItem.iImage = ...; //индекс иконки (из списка контрола)&lt;br /&gt;
	&lt;br /&gt;
pList-&amp;gt;SetItem(&amp;amp; lvItem);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Имеется класс Class1, содержащий мембер типа указатель на Class2. В Class2 также имеется указатель на Class1. Компилятор выдаёт ошибку. Что надо делать?===&lt;br /&gt;
Предварительно объявляем класс Class2. Тогда компилятору будет известно, что описание класса Class2 будет встречено дальше, и станет возможным объявление указателей на класс до описания самого класса.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Class2;//предопределение&lt;br /&gt;
	&lt;br /&gt;
Class1&lt;br /&gt;
{&lt;br /&gt;
	Class2* p;&lt;br /&gt;
};&lt;br /&gt;
	&lt;br /&gt;
Class2&lt;br /&gt;
{&lt;br /&gt;
	Class1* p;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как переключить раскладку в другом (то есть в активном) процессе?===&lt;br /&gt;
Использовать функции:&lt;br /&gt;
   GetKeyboardLayout - определить текущую раскладку&lt;br /&gt;
   LoadKeyboardLayout - загрузить новую раскладку&lt;br /&gt;
&lt;br /&gt;
см.также&lt;br /&gt;
   VerLanguageName - получить строку с описанием языка&lt;br /&gt;
&lt;br /&gt;
(подробности - в MSDN)&lt;br /&gt;
===Как получить хендл контрола Edit зная его ID?===&lt;br /&gt;
Пусть контрол лежит на окне CMyWnd&lt;br /&gt;
Тогда:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void CMyWnd::некая_процедура()&lt;br /&gt;
{&lt;br /&gt;
	//для MFC&lt;br /&gt;
	CEdit* ed=(CEdit* ) GetDlgItem(ID_EDIT1);&lt;br /&gt;
	HWND hwnd=ed-&amp;gt;GetSafeHwnd();&lt;br /&gt;
	...&lt;br /&gt;
	&lt;br /&gt;
	//для Win32 API&lt;br /&gt;
	HWND hwnd=GetDlgItem(m_hWnd,ID_EDIT1);&lt;br /&gt;
	...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Как из дочернего окна закрыть приложение?===&lt;br /&gt;
Нужно послать родительскому окну (*pParent) сообщение WM_CLOSE:&lt;br /&gt;
 pParent-&amp;gt;PostMessage(WM_CLOSE);//MFC&lt;br /&gt;
или&lt;br /&gt;
 ::PostMessage(pParent-&amp;gt;m_hWnd,WM_CLOSE,(WPARAM)0,(LPARAM)0);//API&lt;br /&gt;
===Как корректно перевести BSTR в CString и наоборот?===&lt;br /&gt;
Нужно просто присвоить переменной типа CString переменную типа BSTR.&lt;br /&gt;
Оператор = класса CString сам всё переведёт.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//указатель на будущий буфер с BSTR.&lt;br /&gt;
//	(По сути, BSTR определён как &lt;br /&gt;
//	typedef WCHAR* BSTR;&lt;br /&gt;
//	то есть указатель на 16-битный символ юникод)&lt;br /&gt;
	&lt;br /&gt;
BSTR bstrHE=0;&lt;br /&gt;
	&lt;br /&gt;
CString Str=&amp;quot;мой текст&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
//Выделить память и загрузить адрес блока в bstrHE&lt;br /&gt;
bstrHE=Str.AllocSysString();&lt;br /&gt;
	&lt;br /&gt;
//...	&lt;br /&gt;
//тут работаем с bstrHE[]&lt;br /&gt;
//...&lt;br /&gt;
	&lt;br /&gt;
//освобождаем память&lt;br /&gt;
SysFreeString(bstrHE);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Как получить доступ к графическим ресурсам элементов текущей темы оформления Windows?===&lt;br /&gt;
Использовать функции&lt;br /&gt;
&lt;br /&gt;
OpenThemeData()&lt;br /&gt;
DrawThemeBackground()&lt;br /&gt;
DrawFrameControl()&lt;br /&gt;
CloseThemeData().&lt;br /&gt;
&lt;br /&gt;
(подробности - в MSDN)&lt;br /&gt;
===Имеется класс , производный от CDialog. Когда диалог в фокусе, нажатие на Enter или Esc приводит к закрытию диалога. Как это запретить?===&lt;br /&gt;
При нажатии Enter происходит выполнение команды IDOK,&lt;br /&gt;
при нажатии Esc - IDCANCEL.&lt;br /&gt;
Нужно переопределить в классе виртуальные функции OnOk() и OnCancel(),&lt;br /&gt;
которые соответственно вызываются для этих команд. При помощи&lt;br /&gt;
визарда эти функции добавить можно так: Положить на диалог две кнопки&lt;br /&gt;
с идентификаторами IDOK и IDCANCEL (при создании нового диалога они там&lt;br /&gt;
есть сразу), затем двойной клик по кнопке добавляет соответствующий&lt;br /&gt;
обработчик. В обработчиках надо удалить вызовы СDialog::OnOK() и&lt;br /&gt;
CDialog::OnCancel(), тогда диалог закрываться не будет.&lt;br /&gt;
Однако тогда диалог станет невозможно закрыть кнопкой с крестиком  :)&lt;br /&gt;
&lt;br /&gt;
Лечить так: добавить обработчик сообщения WM_CLOSE - OnClose(), и в нём&lt;br /&gt;
сделать вызов OnOk() или OnCancel() :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void CPlayersPropsDialog::OnClose() &lt;br /&gt;
{&lt;br /&gt;
	CDialog::OnClose();&lt;br /&gt;
	CDialog::OnCancel();//добавлено&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===VC++6. Я написал простейший макрос, а компилятор на него ругается. Ума не приложу, что за глюк?===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	#define my_macr(x,y,z) \&lt;br /&gt;
		z=\&lt;br /&gt;
		(x+y)*\&lt;br /&gt;
		(x-y)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Скорее всего после одного из символов соединения строк &amp;quot;\&amp;quot; имеется&lt;br /&gt;
пробел или табуляция. Их надо удалить. Можно найти их &amp;quot;наощупь&amp;quot;, а&lt;br /&gt;
можно включить показ непечатных символов в студии. Найти эту команду&lt;br /&gt;
можно так:&lt;br /&gt;
Tools-&amp;gt;Customize...-&amp;gt;вкладка Commands. В окошке Category выбрать&lt;br /&gt;
&amp;quot;Edit&amp;quot;, и среди кнопок справа найти кнопку, на которой написано &amp;quot;a.b&amp;quot;&lt;br /&gt;
Эту кнопку надо перетащить на одну из панелей инструментов студии.&lt;br /&gt;
&lt;br /&gt;
===Как получить список всех процесов, включая idle?===&lt;br /&gt;
Использовать функции&lt;br /&gt;
Process32First()&lt;br /&gt;
Precess32Next()&lt;br /&gt;
&lt;br /&gt;
===Как программно установить переменные окружения?===&lt;br /&gt;
Чтобы добавить или изменить их программно, необходимо воспользоваться&lt;br /&gt;
ключом реестра HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\&lt;br /&gt;
Session Manager\Environment, а затем отправить широковещательное&lt;br /&gt;
сообщение WM_SETTINGCHANGE. Это позволит приложениям узнать об&lt;br /&gt;
изменениях:&lt;br /&gt;
&lt;br /&gt;
::SendMessage(HWND_BROADCAST,WM_SETTINGCHANGE,0,0);&lt;br /&gt;
===Как сделать, чтобы у окна был черный фон?===&lt;br /&gt;
переопределить обработчик сообщения WM_CTLCOLOR - OnCtlColor() :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CBrush br(RGB(0,0,0));&lt;br /&gt;
	&lt;br /&gt;
HBRUSH CMyDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) &lt;br /&gt;
{&lt;br /&gt;
	HBRUSH hbr = CMyDlg::OnCtlColor(pDC, pWnd, nCtlColor);&lt;br /&gt;
	&lt;br /&gt;
	//фон диалога (или вьюшки)&lt;br /&gt;
	if(nCtlColor==CTLCOLOR_DLG)&lt;br /&gt;
	{&lt;br /&gt;
		return (HBRUSH)br;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	//фон статиков (если нужно)&lt;br /&gt;
	if(nCtlColor==CTLCOLOR_STATIC)&lt;br /&gt;
	{&lt;br /&gt;
		//делаем фон текста статика прозрачным&lt;br /&gt;
		pDC-&amp;gt;SetBkMode(TRANSPARENT);&lt;br /&gt;
		return (HBRUSH)br;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	return hbr;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Почему на моем компьютере экзешник, созданный в MFC запускается, а на других компьютерах - нет? Требует какую-то  dll-ку.===&lt;br /&gt;
Нужно выбирать режим Release :&lt;br /&gt;
&lt;br /&gt;
Menu-&amp;gt;Build-&amp;gt;Configurations...-&amp;gt;Release,&lt;br /&gt;
&lt;br /&gt;
и экзешник, соответственно, брать из папки Release проекта&lt;br /&gt;
===Как в диалог добавить меню?===&lt;br /&gt;
Надо сделать в ресурсах меню, затем вставить в диалог:&lt;br /&gt;
&lt;br /&gt;
открыть в редакторе диалог, в свойствах (во вкладке General, окошко Menu) указать идентивикатор ресурса меню.&lt;br /&gt;
При помощи визарда добавить для меню обработчики OnCommand() и OnUpdateСommand().&lt;br /&gt;
===Я добавил визардом меню в диалог. Добавил обработчики для пунктов меню. Пункты работают, но OnUpdate для пунктов не вызывается - то есть не получается ни затенить, ни чек поставить. Что делать?===&lt;br /&gt;
В диалоге у меню апдейта не происходит сам, в отличие от мейнфрейма.&lt;br /&gt;
Для этого нужно сделать самим апдейт в обработчике сообщения WM_KICKIDLE.&lt;br /&gt;
Визардом обработчик не добавляется, поэтому можно переопределить виртуальную DefWindowProc() и там обработать:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;afxpriv.h&amp;gt;	//этот файл надо включить, там определёна WM_KICKIDLE&lt;br /&gt;
&lt;br /&gt;
LRESULT CMyDialog::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam) &lt;br /&gt;
{&lt;br /&gt;
	if(message==WM_KICKIDLE)&lt;br /&gt;
	{&lt;br /&gt;
		//делаем апдейт для всех пунктов меню&lt;br /&gt;
		CMenu* pMainMenu=GetMenu();&lt;br /&gt;
		if(pMainMenu)&lt;br /&gt;
		{&lt;br /&gt;
			CCmdUI cmdUI;&lt;br /&gt;
			for (UINT n=0; n &amp;lt; pMainMenu-&amp;gt;GetMenuItemCount(); ++n)&lt;br /&gt;
			{&lt;br /&gt;
				CMenu* pSubMenu = pMainMenu-&amp;gt;GetSubMenu(n);&lt;br /&gt;
				if(!pSubMenu)continue;&lt;br /&gt;
	&lt;br /&gt;
				cmdUI.m_nIndexMax = pSubMenu-&amp;gt;GetMenuItemCount();&lt;br /&gt;
				for (UINT i = 0; i &amp;lt; cmdUI.m_nIndexMax;++i)&lt;br /&gt;
				{&lt;br /&gt;
					cmdUI.m_nIndex = i;&lt;br /&gt;
					cmdUI.m_nID = pSubMenu-&amp;gt;GetMenuItemID(i);&lt;br /&gt;
					cmdUI.m_pMenu = pSubMenu;&lt;br /&gt;
					cmdUI.DoUpdate(this, FALSE);&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	return CDialog::DefWindowProc(message, wParam, lParam);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Как на Visual C++ 6.0 в Главном окне отключить системное меню (в левом верхнем углу) и кнопки(в правом верхнем углу) ?===&lt;br /&gt;
При создании окна нужно убрать стиль WS_SYSMENU&lt;br /&gt;
(теперь пользователь корректно может закрыть окно только Alt+F4  ,&lt;br /&gt;
ну или если вы предоставите ему дополнительную возможность сделать это )&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пример 1. (для SDI, MDI)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//этот обработчик уже добавлен визардом&lt;br /&gt;
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT&amp;amp; cs)&lt;br /&gt;
{&lt;br /&gt;
	if( !CFrameWnd::PreCreateWindow(cs) )&lt;br /&gt;
		return FALSE;&lt;br /&gt;
	// TODO: Modify the Window class or styles here by modifying&lt;br /&gt;
	//  the CREATESTRUCT cs&lt;br /&gt;
&lt;br /&gt;
	///////////////////////////////&lt;br /&gt;
	//добавленная часть&lt;br /&gt;
	{&lt;br /&gt;
		//убираем стиль&lt;br /&gt;
		cs.style&amp;amp;=~WS_SYSMENU;&lt;br /&gt;
	}&lt;br /&gt;
	///////////////////////////////&lt;br /&gt;
&lt;br /&gt;
	return TRUE;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Пример 2. (для диалога)&lt;br /&gt;
Если диалог описан в ресурсах, то в свойствах диалога убрать галочки&lt;br /&gt;
  &amp;quot;System menu&amp;quot;&lt;br /&gt;
  &amp;quot;Minimize box&amp;quot;&lt;br /&gt;
  &amp;quot;Maximize box&amp;quot;&lt;br /&gt;
===Хочу сделать так, чтобы пользователь не мог нажать на кнопку, пока программа не разрешит.===&lt;br /&gt;
Нужно применить метод класса CWnd::EnableWindow(...) для кнопки.&lt;br /&gt;
Значение параметра 0 делает кнопку неактивной, 1 - делает активной.&lt;br /&gt;
(кстати, не только для кнопки можно, а для любого класса, производного&lt;br /&gt;
от класса CWnd)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пример 1. Пусть имеется некий диалог, на нём лежит кнопка c ID == IDC_1.&lt;br /&gt;
в любом месте кода диалога (кроме конструктора и деструктора , хотя, если&lt;br /&gt;
проверить наличие валидного хендла диалога, как в примере, то ничего&lt;br /&gt;
страшного не будет и там)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//делаем кнопку неактивной&lt;br /&gt;
if(m_hWnd)&lt;br /&gt;
{&lt;br /&gt;
	CWnd* pw=0;&lt;br /&gt;
	pw=GetDlgItem(IDC_1);&lt;br /&gt;
	if(pw)pw-&amp;gt;EnableWindow(0);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Что означают сообщения, которые студия выводит при компиляции, вроде таких : Loaded 'C:\WINDOWS\SYSTEM\WSOCK32.DLL', no matching symbolic information found. ===&lt;br /&gt;
Это строка говорит о том, что студия не смогла найти отладочные&lt;br /&gt;
символы для WSOCK32.DLL. В этом нет ничего страшного, просто при наличии&lt;br /&gt;
отладочных символов в процессе отладки можно получить доступ к именам&lt;br /&gt;
функции из системных DLL. Например, вместо&lt;br /&gt;
 KERNEL32! 0x77E8B184() -&lt;br /&gt;
 увидим&lt;br /&gt;
 KERNEL32!CreateThread.&lt;br /&gt;
===Как обработать сообщения , которое приходит к некому контролу (скажем CEdit) ?===&lt;br /&gt;
Нужно произвести от CEdit свой класс, и в виртуальной процедуре класса WindowProc перехватить нужные сообщения.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
virtual LRESULT WindowProc(&lt;br /&gt;
   UINT message,&lt;br /&gt;
   WPARAM wParam,&lt;br /&gt;
   LPARAM lParam &lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Пример. Полностью выключаем, скажем, обработку сообщения WM_CHAR&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	LRESULT CMyEdit::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) &lt;br /&gt;
	{&lt;br /&gt;
		switch(message)&lt;br /&gt;
		{&lt;br /&gt;
			case WM_CHAR:&lt;br /&gt;
			{&lt;br /&gt;
				return 0;&lt;br /&gt;
			}&lt;br /&gt;
			break;&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		return CEdit::WindowProc(message, wParam, lParam);&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Чтобы связать экземпляр класса с контролом на форме, добавьте визардом для&lt;br /&gt;
контрола переменную класса (выбрав не Value а Control).&lt;br /&gt;
===Как настроить количество пробелов в табуляции?===&lt;br /&gt;
Tools-&amp;gt;Options-&amp;gt;Tabs-&amp;gt;Insert Spaces&lt;br /&gt;
(или  правой кнопкой мыши по тексту-&amp;gt; properties)&lt;br /&gt;
===Как автоматически расставить отступы?===&lt;br /&gt;
Выделить текст для форматирования, нажать Alt+F8&lt;br /&gt;
&lt;br /&gt;
Есть ещё программа Artistic Style, которая занимается&lt;br /&gt;
переформатированием кода&lt;br /&gt;
http://sourceforge.net/projects/astyle/&lt;br /&gt;
===Поиск границ блока===&lt;br /&gt;
&amp;quot;CTRL+ }&amp;quot; ищет парную фигурную скобку в тексте и переходит на неё&lt;br /&gt;
===Вертикальное выделение текста===&lt;br /&gt;
&amp;quot;Alt + выделение мышкой&amp;quot; - позволяет выделять вертикальные фрагменты текста&lt;br /&gt;
===Как узнать количество установленных в CListCtrl столбцов ?===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CListCtrl* pL=...; //указатель на переменную-контрол&lt;br /&gt;
&lt;br /&gt;
int count=pL-&amp;gt;GetHeaderCtrl()-&amp;gt;GetItemCount();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как получить иконку приложения?===&lt;br /&gt;
Если приложение запущено, то нужно найти его главное окно и&lt;br /&gt;
послать ему сообщение WM_GETICON.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//функция возвращант хендл иконки &lt;br /&gt;
LRESULT SendMessage(hWnd, WM_GETICON, wParam, 0);&lt;br /&gt;
&lt;br /&gt;
//hWnd == хендл окна приложения&lt;br /&gt;
//wParam == &lt;br /&gt;
//	1)==ICON_BIG - получить большую иконку&lt;br /&gt;
//	2)==ICON_SMALL - получить маленькую иконку&lt;br /&gt;
//	3)==ICON_SMALL2 - получить маленькую иконку, если она определена&lt;br /&gt;
//				в приложении. Если её нет, то маленькую иконку, &lt;br /&gt;
//				сгенерированную системой из большой иконки&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как в CString можно найти или вырезать часть строки?===&lt;br /&gt;
есть такие методы в CString :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//вырезает кусок строки&lt;br /&gt;
CString Mid(int nFirst) const;&lt;br /&gt;
CString Mid(int nFirst,  int nCount) const;&lt;br /&gt;
&lt;br /&gt;
//возвращает кусок строки (сначала или с конца)&lt;br /&gt;
CString Left(int nCount ) const;&lt;br /&gt;
CString Right(int nCount ) const;&lt;br /&gt;
&lt;br /&gt;
//возвращает начальный кусок строки, в котором есть только&lt;br /&gt;
//символы из набора,представленного в lpszCharSet&lt;br /&gt;
CString SpanIncluding(LPCTSTR lpszCharSet ) const;&lt;br /&gt;
&lt;br /&gt;
//возвращает начальный кусок строки, в котором нет&lt;br /&gt;
//символов из набора,представленного в lpszCharSet&lt;br /&gt;
CString SpanExcluding(LPCTSTR lpszCharSet ) const; &lt;br /&gt;
&lt;br /&gt;
//убирает &amp;quot;пробелоподобные&amp;quot; символы из самого начала строки&lt;br /&gt;
//(то есть - пробел, табуляцию (\t) , возврат каретки, перевод строки (/r/n))&lt;br /&gt;
void TrimLeft();&lt;br /&gt;
//убирает все повторы символа из самого начала строки&lt;br /&gt;
void TrimLeft(TCHAR chTarget );&lt;br /&gt;
//убирает из самого начала строки все символа из набора lpszTargets &lt;br /&gt;
void TrimLeft(LPCTSTR lpszTargets ); &lt;br /&gt;
&lt;br /&gt;
void TrimRight();&lt;br /&gt;
void TrimRight(TCHAR chTarget );&lt;br /&gt;
void TrimRight(LPCTSTR lpszTargets ); &lt;br /&gt;
&lt;br /&gt;
//поиск в строке&lt;br /&gt;
int Find( TCHAR ch ) const;&lt;br /&gt;
int Find( LPCTSTR lpszSub ) const;&lt;br /&gt;
int Find( TCHAR ch, int nStart ) const;&lt;br /&gt;
int Find( LPCTSTR pstr, int nStart ) const;&lt;br /&gt;
&lt;br /&gt;
//поиск, начиная с конца&lt;br /&gt;
int ReverseFind( TCHAR ch ) const;&lt;br /&gt;
&lt;br /&gt;
//поиск позиции первого символа, одного из набора,&lt;br /&gt;
// представленного в lpszCharSet&lt;br /&gt;
int FindOneOf( LPCTSTR lpszCharSet ) const;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Есть у меня CListBox и я в ходе выполнения программы добавляю в него строки. Но я не могу посмотреть что именно добавляется. Вывод результатов происходит в конце выполнения процедуры...===&lt;br /&gt;
Если нужно делать принудительную перерисовку окна во время&lt;br /&gt;
длительных вычислений, то нужно вызывать для окна, которое&lt;br /&gt;
надо перерисовать метод&lt;br /&gt;
  RedrawWindow()&lt;br /&gt;
с параметрами по умолчанию, или пару&lt;br /&gt;
  Invalidate(0);&lt;br /&gt;
  UpdateWindow();&lt;br /&gt;
Это приводит к пометке всего окна к перерисовке и отправлению&lt;br /&gt;
сообщения WM_PAINT в оконную процедуру в обход очереди&lt;br /&gt;
сообщений, вызывая немедленную перерисовку окна.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CWnd* pw=...;//окно , которое надо перерисовывать&lt;br /&gt;
&lt;br /&gt;
for(int i=0;i&amp;lt;10000)&lt;br /&gt;
{&lt;br /&gt;
	//меняется содержимое окна&lt;br /&gt;
	//...&lt;br /&gt;
&lt;br /&gt;
	//немедленная перерисовка&lt;br /&gt;
	pw-&amp;gt;Invalidate(0);&lt;br /&gt;
	pw-&amp;gt;UpdateWindow();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Я написал DLL , которую используют несколько приложений. Всё вроде работает, но когда происходит очередной вызов функции из DLL , почему то данные в функции обнуляются. С чем это связано ?===&lt;br /&gt;
Переменные и массивы в DLL, содержимое которых должно использоваться несколькими процессами, должны объявляться статическими. Статическая переменная или массив инициализируются только один раз в момент загрузки DLL.&lt;br /&gt;
Пример:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DWORD calltest()&lt;br /&gt;
{&lt;br /&gt;
	//будет выполнено только при первом вызове&lt;br /&gt;
	static DWORD callcount=0;&lt;br /&gt;
	static DWORD str[1000]={0}; &lt;br /&gt;
&lt;br /&gt;
	//будет выполняться каждый раз&lt;br /&gt;
	return ++callcount;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как открыть проекцию файла в память и как с ней работать?===&lt;br /&gt;
Как открыть проекцию файла в память и как с ней работать?&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HANDLE CreateFileMapping(&lt;br /&gt;
  HANDLE hFile,	//хендл уже открытого файла&lt;br /&gt;
  LPSECURITY_ATTRIBUTES lpAttributes,&lt;br /&gt;
  DWORD flProtect,	//способ открытия проекции&lt;br /&gt;
  DWORD dwMaximumSizeHigh,	//размер файла (старшие 4 байта , обычно==0)&lt;br /&gt;
  DWORD dwMaximumSizeLow,	//размер файла (младшие 4 байта)&lt;br /&gt;
  LPCTSTR lpName&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Доступ к созданной проекции производится процедурой&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LPVOID MapViewOfFile(&lt;br /&gt;
  HANDLE hFileMappingObject, //хендл проекции&lt;br /&gt;
  DWORD dwDesiredAccess,	//способ работы с проекцией&lt;br /&gt;
  DWORD dwFileOffsetHigh,&lt;br /&gt;
  DWORD dwFileOffsetLow, //смещение от начала файла (младшие 4 байта)&lt;br /&gt;
  SIZE_T dwNumberOfBytesToMap //длина в байтах (если ==0 - то весь файл)&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
далее с файлом можно работать как с обычным массивом в памяти.&lt;br /&gt;
&lt;br /&gt;
После работы с проекцией , её надо освободить процедурой&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
BOOL UnmapViewOfFile(&lt;br /&gt;
  LPCVOID lpBaseAddress //адрес, который вернула процедура MapViewOfFile&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Пример.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HANDLE hMapFile=0;//для проекции&lt;br /&gt;
&lt;br /&gt;
HANDLE hFile=...;//хендл уже открытого файла&lt;br /&gt;
DWORD dwdFileLen=...;//размер открытого файла&lt;br /&gt;
&lt;br /&gt;
//создаём проекцию &amp;quot;только для чтения&amp;quot;&lt;br /&gt;
hMapFile=::CreateFileMapping(hFile,0,PAGE_READONLY,0,dwdFileLen,0);&lt;br /&gt;
&lt;br /&gt;
//хендл hFile можно закрыть уже здесь, в принципе,&lt;br /&gt;
//но мы сделаем это позже&lt;br /&gt;
&lt;br /&gt;
//получаем доступ к проекции (тоже только для чтения)&lt;br /&gt;
BYTE* pbyFile=(BYTE*)::MapViewOfFile(hMapFile,FILE_MAP_READ,0,0,0);&lt;br /&gt;
&lt;br /&gt;
///////////////////&lt;br /&gt;
//тут работаем с массивом pbyFile[dwdFileLen] как с обычным,&lt;br /&gt;
//только не забываем, что он открыт только для чтения&lt;br /&gt;
//...&lt;br /&gt;
//...&lt;br /&gt;
//...&lt;br /&gt;
///////////////////&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//отключаем файл данных от адресного пространства&lt;br /&gt;
UnmapViewOfFile(pbyFile);&lt;br /&gt;
&lt;br /&gt;
//освобождаем хендл проекции&lt;br /&gt;
CloseHandle(hMapFile)&lt;br /&gt;
&lt;br /&gt;
//освобождаем хендл открытого файла&lt;br /&gt;
CloseHandle(hFile);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Использую MFC Grid control 2.25 , не получается отобразить картинку в ячейке. Как это делается ?===&lt;br /&gt;
Нужно создать список изображений (CImageList) , затем передать указатель на список в контрол. Поскольку контрол лишь копирует указатель , список должен создаваться динамически, либо быть членом класса, экземпляр которого существует всё время работы контрола.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 m_GridMarket&lt;br /&gt;
CImageList m_ImageList;&lt;br /&gt;
CGridCtrL m_Grid1&lt;br /&gt;
...&lt;br /&gt;
...&lt;br /&gt;
//неким образом создаётся список&lt;br /&gt;
m_ImageList.Create(...);&lt;br /&gt;
//...&lt;br /&gt;
&lt;br /&gt;
//вставляем в контрол&lt;br /&gt;
m_Grid1.SetImageList(&amp;amp;m_ImageList);&lt;br /&gt;
&lt;br /&gt;
//&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как при помощи IPicture отобразить картинку из файла? ===&lt;br /&gt;
Пример - несложная функция, отображающая картинку из файла&lt;br /&gt;
&lt;br /&gt;
поддерживаются форматы&lt;br /&gt;
BMP, GIF, JPEG, PNG, TIFF, EMF&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;quot;atlconv.h&amp;quot;&lt;br /&gt;
#define HandleIsValid(H) (H!=(HANDLE)-1 &amp;amp;&amp;amp; H!=(HANDLE)0)&lt;br /&gt;
&lt;br /&gt;
//*pDestDC - CDC, на который предполагается вывод картинки&lt;br /&gt;
//pchzFilePath - путь к файлу&lt;br /&gt;
//pWid - (возвращает) ширина картинки&lt;br /&gt;
//pHig - (возвращает) высота картинки&lt;br /&gt;
bool DrawBitmapFromFile(CDC* pDestDC,const char* pchzFilePath,int *pWid=0,int *pHig=0)&lt;br /&gt;
{&lt;br /&gt;
	bool result=false;&lt;br /&gt;
&lt;br /&gt;
	if(pWid)*pWid=0;&lt;br /&gt;
	if(pHig)*pHig=0;&lt;br /&gt;
&lt;br /&gt;
	int Wid=0;&lt;br /&gt;
	int Hig=0;&lt;br /&gt;
&lt;br /&gt;
	IPicture* pPic=0;&lt;br /&gt;
	try&lt;br /&gt;
	{&lt;br /&gt;
		IPicture* ptmpPic=0;&lt;br /&gt;
		USES_CONVERSION;&lt;br /&gt;
		HRESULT hr;&lt;br /&gt;
&lt;br /&gt;
		CString txt=pchzFilePath;&lt;br /&gt;
		hr= ::OleLoadPicturePath(&lt;br /&gt;
			const_cast&amp;lt;LPOLESTR&amp;gt;(T2COLE(txt)),&lt;br /&gt;
			0,0,0,IID_IPicture,&lt;br /&gt;
			reinterpret_cast&amp;lt;void **&amp;gt;(&amp;amp;ptmpPic)&lt;br /&gt;
			);&lt;br /&gt;
&lt;br /&gt;
		if(hr==S_OK &amp;amp;&amp;amp; ptmpPic)&lt;br /&gt;
		{&lt;br /&gt;
			pPic=ptmpPic;&lt;br /&gt;
		}&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			throw 0;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		OLE_XPOS_HIMETRIC cxSrc;&lt;br /&gt;
		OLE_YPOS_HIMETRIC cySrc;&lt;br /&gt;
&lt;br /&gt;
		if(S_OK!=pPic-&amp;gt;get_Width(&amp;amp;cxSrc))throw 0;&lt;br /&gt;
		if(S_OK!=pPic-&amp;gt;get_Height(&amp;amp;cySrc))throw 0;&lt;br /&gt;
&lt;br /&gt;
		Wid=cxSrc/26;&lt;br /&gt;
		Hig=cySrc/26;&lt;br /&gt;
&lt;br /&gt;
		//рисуем&lt;br /&gt;
		if(S_OK !=pPic-&amp;gt;Render(pDestDC-&amp;gt;GetSafeHdc(),&lt;br /&gt;
			0,Hig,Wid,-Hig,0,0,cxSrc,cySrc,0))throw 0;&lt;br /&gt;
	}&lt;br /&gt;
	catch(...)&lt;br /&gt;
	{&lt;br /&gt;
		result=false;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if(pPic)&lt;br /&gt;
	{&lt;br /&gt;
		pPic-&amp;gt;Release();&lt;br /&gt;
		pPic=0;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	if(pWid)*pWid=Wid;&lt;br /&gt;
	if(pHig)*pHig=Hig;&lt;br /&gt;
&lt;br /&gt;
	return result;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===У меня модальное диалоговое окно, в нем поле редактирования мультилайновое, т.е. чтобы перейти на новую строку надо нажать ентер, но вызывается стандартный обработчик диалогового окна. Подскажите, что делать?===&lt;br /&gt;
Нужно в редакторе ресурсов поставить для CEdit окошка галочку&lt;br /&gt;
свойства WantReturn,&lt;br /&gt;
&lt;br /&gt;
или добавить ES_WANTRETURN при создании CEdit контрола динамически.&lt;br /&gt;
===Как выводят картинку-логотип(splash screen) при запуске программы? То есть, когда загружается программа на экран выводится картинка, потом она исчезает(загрузка программы закончена) и пользователь может приступать к работе ===&lt;br /&gt;
Для этого используется класс, производный от CDialog. Этот диалог после создания показывает себя на экран, выводя на себя рисунок. Также запускает таймет, по срабатывани которого диалог гасится. Создаётся диалог InitInstance приложения.&lt;br /&gt;
&lt;br /&gt;
В VC6++ также есть уже готовый компонент&lt;br /&gt;
Project-&amp;gt;Add To Project -&amp;gt; Components and Controls-&amp;gt;(в папке &amp;quot;Visual C++ Components&amp;quot; есть SplashScreen.)&lt;br /&gt;
===Как сделать, чтобы при выпадении списка у ComboBox была не одна строка, а больше, вроде все свойства покрутил, не помогает Вместо выпадающего списка одна строка и скролл...===&lt;br /&gt;
В редакторе ресурсов надо щелкнуть в комбобоксе на треугольнике - появляется рамка для растягивания вниз - размер выпадающего списка.&lt;br /&gt;
===В VC++.net , что делать после того, как на форму установил ActiiveX ListView, как объявить класс и переменную для этого элемента?===&lt;br /&gt;
Щёлкнуть правой кнопкой мыши на элементе , в меню - add variable или add class&lt;br /&gt;
===Как вставить данные в буфер обмена (Clipboard) ? Как их оттуда вытащить ?===&lt;br /&gt;
&lt;br /&gt;
1) копирование в буфер обмена:&lt;br /&gt;
&lt;br /&gt;
  1.Готовим данные&lt;br /&gt;
    а.Выделяем память из кучи,  вызывая GlobalAlloc()&lt;br /&gt;
    б.Получаем указатель на выделенную память, вызывая GlobalLock()&lt;br /&gt;
    в.Заполняем данные&lt;br /&gt;
    г.Освобождаем указатель , вызывая GlobalUnlock();&lt;br /&gt;
&lt;br /&gt;
  2.Открываем буфер обмена , вызывая OpenClipboard();&lt;br /&gt;
  3.Очищаем буфер, вызывая EmptyClipboard();&lt;br /&gt;
  4.Вызываем SetClipboardData() один раз для каждого формата&lt;br /&gt;
      вставляемых данных (имеется в виду - если одни и те же&lt;br /&gt;
      данные представлены в разных форматах, и приложение&lt;br /&gt;
      может эти форматы создать)&lt;br /&gt;
  5.Закрываем буфер, вызывая CloseClipboard();&lt;br /&gt;
  6.ВЫЗЫВАТЬ GlobalFree() НЕ НУЖНО , в этом случае это&lt;br /&gt;
      предоставлено системе&lt;br /&gt;
&lt;br /&gt;
Скажем, хотим поместить в буфер обмена туда текст.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	//готовим данные&lt;br /&gt;
	//выделяем из кучи память для данных&lt;br /&gt;
	HANDLE hglbCopy = GlobalAlloc(GMEM_MOVEABLE,10);&lt;br /&gt;
	if(!hglbCopy)return;&lt;br /&gt;
&lt;br /&gt;
	//получаем указатель&lt;br /&gt;
	void* lpStr = GlobalLock(hglbCopy);&lt;br /&gt;
	if(!lpStr)return;&lt;br /&gt;
&lt;br /&gt;
	//заполняем данные&lt;br /&gt;
	strcpy((char*)lpStr,&amp;quot;my text&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	//освобождаем указатель&lt;br /&gt;
	GlobalUnlock(hglbCopy);&lt;br /&gt;
	lpStr=0;&lt;br /&gt;
&lt;br /&gt;
	//открываем буфер обмена&lt;br /&gt;
	OpenClipboard();&lt;br /&gt;
	//очищаем&lt;br /&gt;
	EmptyClipboard();&lt;br /&gt;
&lt;br /&gt;
	//текстовый формат&lt;br /&gt;
	SetClipboardData(CF_TEXT,hglbCopy);&lt;br /&gt;
&lt;br /&gt;
	//закрываем буфер&lt;br /&gt;
	CloseClipboard();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
2) извлечение из буфера обмена&lt;br /&gt;
&lt;br /&gt;
  1.Проверяем, что поддерживается нужный формат данных,&lt;br /&gt;
      вызывая IsClipboardFormatAvailable()&lt;br /&gt;
  2.Открываем буфер обмена , вызывая OpenClipboard();&lt;br /&gt;
  3.Достаём данные&lt;br /&gt;
   а.Получаем из буфера хендл требуемого формата,&lt;br /&gt;
      вызывая GetClipboardData()&lt;br /&gt;
    б.Получаем указатель на выделенную память, вызывая GlobalLock()&lt;br /&gt;
    в.Работаем с данными&lt;br /&gt;
    г.Освобождаем указатель , вызывая GlobalUnlock();&lt;br /&gt;
  4.Закрываем буфер, вызывая CloseClipboard();&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	//Проверяем, что поддерживается нужный формат данных,&lt;br /&gt;
	if(!IsClipboardFormatAvailable(CF_TEXT))return;&lt;br /&gt;
&lt;br /&gt;
	//открываем буфер обмена&lt;br /&gt;
	OpenClipboard();&lt;br /&gt;
&lt;br /&gt;
	//достаём данные&lt;br /&gt;
&lt;br /&gt;
	//текстовый формат&lt;br /&gt;
	HANDLE hglbCopy = GetClipboardData(CF_TEXT);&lt;br /&gt;
	if(!hglbCopy)return;&lt;br /&gt;
&lt;br /&gt;
	//получаем указатель&lt;br /&gt;
	void* lpStr = GlobalLock(hglbCopy);&lt;br /&gt;
	if(!lpStr)return;&lt;br /&gt;
&lt;br /&gt;
	//читаем данные&lt;br /&gt;
	char data[10];&lt;br /&gt;
	memmove(data,lpStr,sizeof(data));&lt;br /&gt;
&lt;br /&gt;
	//освобождаем указатель&lt;br /&gt;
	GlobalUnlock(hglbCopy);&lt;br /&gt;
	lpStr=0;&lt;br /&gt;
&lt;br /&gt;
	//закрываем буфер&lt;br /&gt;
	CloseClipboard();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как получить полный путь к экзешнику из самой программы ?===&lt;br /&gt;
В командную строку первым параметром система всегда передаёт заключённый в кавычки полный путь к файлу запущенной программы Достаём путь таким образом :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
BOOL CMyApp::InitInstance()&lt;br /&gt;
{&lt;br /&gt;
	//добыча полного имени экзешника&lt;br /&gt;
	CString csFullExeName;&lt;br /&gt;
	{&lt;br /&gt;
		CString csAppName=GetCommandLine();&lt;br /&gt;
		csAppName.Delete(0,1);&lt;br /&gt;
		csAppName.Replace('\&amp;quot;','\0');&lt;br /&gt;
		csFullExeName=(const char*)csAppName;&lt;br /&gt;
	}&lt;br /&gt;
	//теперь csFullExeName - содержит искомый путь&lt;br /&gt;
&lt;br /&gt;
	//...&lt;br /&gt;
	//...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Каким способом можно exe файл может заменить самого себя? То есть, моя программа обновляется, например, через Internet, и хочет обновить свой exe-файл. Но так как он в данный момент запущен - это будет, естественно, запрещено. Как это можно проще всего сделать?===&lt;br /&gt;
Один из способов - сделать копию экзешника и из него обновиться&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define def_exeNAMEup	&amp;quot;c:\\myprog_update.exe&amp;quot;&lt;br /&gt;
#define def_exeNAMEdnld	&amp;quot;c:\\myprog_downloaded.exe&amp;quot;&lt;br /&gt;
#define def_keyUdate	&amp;quot;/update&amp;quot;&lt;br /&gt;
&lt;br /&gt;
void CTESTFAQApp::UpdateItself()&lt;br /&gt;
{&lt;br /&gt;
	//добыча полного имени экзешника&lt;br /&gt;
	CString csFullExeName;&lt;br /&gt;
	{&lt;br /&gt;
		CString csAppName=GetCommandLine();&lt;br /&gt;
		csAppName.Delete(0,1);&lt;br /&gt;
		csAppName.Replace('\&amp;quot;','\0');&lt;br /&gt;
		csFullExeName=(const char*)csAppName;&lt;br /&gt;
	}&lt;br /&gt;
	//теперь csFullExeName - содержит искомый путь&lt;br /&gt;
&lt;br /&gt;
	//делаем копию экзешника с другим именем&lt;br /&gt;
	CopyFile(csFullExeName,def_exeNAMEup,0);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	//передаём в параметры нового процесса ключ и путь к текущему файлу&lt;br /&gt;
	CString csParams=def_keyUdate;&lt;br /&gt;
	csParams+=&amp;quot; &amp;quot;;&lt;br /&gt;
	csParams+=csFullExeName;&lt;br /&gt;
&lt;br /&gt;
	//запускаем копию&lt;br /&gt;
	STARTUPINFO si;&lt;br /&gt;
	PROCESS_INFORMATION pi;&lt;br /&gt;
	ZeroMemory(&amp;amp;si,sizeof(si));&lt;br /&gt;
	si.cb = sizeof(si);&lt;br /&gt;
	ZeroMemory(&amp;amp;pi,sizeof(pi));&lt;br /&gt;
	if(CreateProcess(def_exeNAMEup,def_keyUdate,0,0,0,0,0,0,&amp;amp;si,&amp;amp;pi))&lt;br /&gt;
	{&lt;br /&gt;
		//завершаем текущий процесс&lt;br /&gt;
		ExitFromMyApp();&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void CTESTFAQApp::ExitFromMyApp()&lt;br /&gt;
{&lt;br /&gt;
	exit(0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
BOOL CTESTFAQApp::InitInstance()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
	//смотрим, не запустили ли для апдейта?&lt;br /&gt;
&lt;br /&gt;
	CString txt;&lt;br /&gt;
	txt=m_lpCmdLine;&lt;br /&gt;
	if(txt.Find(def_keyUdate)==0)&lt;br /&gt;
	{&lt;br /&gt;
		//делаем айдейт&lt;br /&gt;
		txt.Replace(def_keyUdate,&amp;quot;&amp;quot;);&lt;br /&gt;
		txt.TrimLeft();&lt;br /&gt;
&lt;br /&gt;
		CString csFullExeName=txt;&lt;br /&gt;
&lt;br /&gt;
		//берём откуда то уже скачанный файл обновления&lt;br /&gt;
		//...&lt;br /&gt;
		CString csFull_Downloaded_ExeName=def_exeNAMEdnld;&lt;br /&gt;
&lt;br /&gt;
		//копируем файл (обновляем старый то есть)&lt;br /&gt;
		CopyFile(csFull_Downloaded_ExeName,csFullExeName,0);&lt;br /&gt;
&lt;br /&gt;
		//запускаем обновлённого мученника&lt;br /&gt;
		STARTUPINFO si;&lt;br /&gt;
		PROCESS_INFORMATION pi;&lt;br /&gt;
		ZeroMemory(&amp;amp;si,sizeof(si));&lt;br /&gt;
		si.cb = sizeof(si);&lt;br /&gt;
		ZeroMemory(&amp;amp;pi,sizeof(pi));&lt;br /&gt;
		if(CreateProcess(csFullExeName,0,0,0,0,0,0,0,&amp;amp;si,&amp;amp;pi))&lt;br /&gt;
&lt;br /&gt;
		ExitFromMyApp();&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
	//...&lt;br /&gt;
	//...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Есть строка символов (страничка из Инета) в кодировке utf-8 (строка char*). Как мне ее получить в формате String&lt;br /&gt;
или в char* в кодировке ANSI (cp 1251) ?===&lt;br /&gt;
Можно перевести строку из UTF8 в Unicode, затем из Unicode в 1251&lt;br /&gt;
&lt;br /&gt;
Ниже приведена структура, содержащая процедуры перекодирования,&lt;br /&gt;
а также процедуру с примером использования&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//описание структуры&lt;br /&gt;
struct coder&lt;br /&gt;
{&lt;br /&gt;
	//utf8-&amp;gt;unicode&lt;br /&gt;
	static wchar_t* utf8_to_unicode__dontForgetDeleteArr(const char *utf8_string)&lt;br /&gt;
	{&lt;br /&gt;
		wchar_t* pRes=0;&lt;br /&gt;
		int res_len=0;&lt;br /&gt;
&lt;br /&gt;
		//тест на возможность преобразования&lt;br /&gt;
		res_len=MultiByteToWideChar(CP_UTF8,0,utf8_string,-1,0,0);&lt;br /&gt;
		if(!res_len)return 0;&lt;br /&gt;
&lt;br /&gt;
		//выделяем память&lt;br /&gt;
		pRes = new wchar_t[res_len];&lt;br /&gt;
		if(!pRes)return 0;&lt;br /&gt;
&lt;br /&gt;
		//преобразование&lt;br /&gt;
		if(!MultiByteToWideChar(CP_UTF8,0,utf8_string,-1,pRes,res_len))&lt;br /&gt;
		{&lt;br /&gt;
			delete [] pRes;&lt;br /&gt;
			return 0;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		return pRes;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	//unicode-&amp;gt;1251&lt;br /&gt;
	static char * unicode_to_1251__dontForgetDeleteArr(const wchar_t *unicode_string)&lt;br /&gt;
	{&lt;br /&gt;
		char* pRes=0;&lt;br /&gt;
		int res_len=0;&lt;br /&gt;
&lt;br /&gt;
		//тест на возможность преобразования&lt;br /&gt;
		res_len = WideCharToMultiByte(1251,0,unicode_string,-1,0,0,0,0);&lt;br /&gt;
		if(!res_len)return 0;&lt;br /&gt;
&lt;br /&gt;
		//выделяем память&lt;br /&gt;
		pRes=new char[res_len];&lt;br /&gt;
		if(!pRes)return 0;&lt;br /&gt;
&lt;br /&gt;
		//преобразование&lt;br /&gt;
		if(!WideCharToMultiByte(1251,0,unicode_string,-1,pRes,res_len,0,0))&lt;br /&gt;
		{&lt;br /&gt;
			delete [] pRes;&lt;br /&gt;
			return 0;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		return pRes;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	//процедура с примером&lt;br /&gt;
	static void Example()&lt;br /&gt;
	{&lt;br /&gt;
		wchar_t* unicode_string=0;&lt;br /&gt;
		char* cp1251_string=0;&lt;br /&gt;
&lt;br /&gt;
		//исходный текст&lt;br /&gt;
		char utf8_string[] = &amp;quot;UTF-8 + СЂСѓСЃСЃРєРёР№ С‚РµРєСЃС‚&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
		for(;;)&lt;br /&gt;
		{&lt;br /&gt;
&lt;br /&gt;
			unicode_string=utf8_to_unicode__dontForgetDeleteArr(utf8_string);&lt;br /&gt;
			if(!unicode_string)&lt;br /&gt;
			{&lt;br /&gt;
				AfxMessageBox(&amp;quot;Не удалось конвертировать в unicode!&amp;quot;);&lt;br /&gt;
				break;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			cp1251_string = unicode_to_1251__dontForgetDeleteArr(unicode_string);&lt;br /&gt;
&lt;br /&gt;
			if(!cp1251_string)&lt;br /&gt;
			{&lt;br /&gt;
				AfxMessageBox(&amp;quot;Не удалось конвертировать из unicode!&amp;quot;);&lt;br /&gt;
				break;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			break;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		//cp1251_string - результат&lt;br /&gt;
		AfxMessageBox(cp1251_string);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
		//не забываем удалить массивы&lt;br /&gt;
		if(unicode_string)&lt;br /&gt;
		{&lt;br /&gt;
			delete [] unicode_string;&lt;br /&gt;
			unicode_string=0;&lt;br /&gt;
		}&lt;br /&gt;
		if(cp1251_string)&lt;br /&gt;
		{&lt;br /&gt;
			delete [] cp1251_string;&lt;br /&gt;
			cp1251_string=0;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
//вызов примера&lt;br /&gt;
coder::Example();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как организовать взаимодействие программы на VC.net с Access-овской базой данных?===&lt;br /&gt;
Проще всего подключить ADO компоненты и сделать все на них.&lt;br /&gt;
Компоненты  ADO (ADODC,DATAGRID и т.п.) это ActiveX.&lt;br /&gt;
В редакторе ресурсов, во всплывающем меню, есть Insert ActiveX Control -&amp;gt; открывается список всех компоент,&lt;br /&gt;
зарегистрированых на машине. Нужно найти компоненты (Это компоненты от MS и они помечены (OLEDB)) и вставить их в диалог. Для того что бы иметь возможность управлять ими, нужно импортировать обертки для них, это делается при помощи ClassWisard, там есть импорт-&amp;gt;класс-&amp;gt;указать файл с компоентой (OSX).&lt;br /&gt;
Появляется список всех классов, объявленых внутри.&lt;br /&gt;
Проставляем галочки, нажимаем ОК.&lt;br /&gt;
&lt;br /&gt;
[[Category:FAQ]]&lt;/div&gt;</summary>
		<author><name>Mczim</name></author>	</entry>

	<entry>
		<id>https://wiki.shelek.ru/index.php?title=FAQ:WinAPI,_VCPP_Part_3&amp;diff=408</id>
		<title>FAQ:WinAPI, VCPP Part 3</title>
		<link rel="alternate" type="text/html" href="https://wiki.shelek.ru/index.php?title=FAQ:WinAPI,_VCPP_Part_3&amp;diff=408"/>
				<updated>2008-08-14T18:37:41Z</updated>
		
		<summary type="html">&lt;p&gt;Mczim: пропущеи пробел перезапятой в заголовке&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Имеется приложение на основе CRichEditView. Как узнать, что пользователь меняет текст?===&lt;br /&gt;
Добавить обработчик сообщения EN_CHANGE. Сообщение генерируется CRichEditView каждый раз, когда пользователь изменяет текст в окне CRichEditView&lt;br /&gt;
===Чем метод CArray::GetSize отличается от метода CArray::GetCount?===&lt;br /&gt;
Абсолютно ничем. (Скорее всего, были предыдущие библиотеки, в которых функции, одинаковые по смыслу, имели разные имена. Поэтому в целях совместимости оставили оба)&lt;br /&gt;
===Как загрузить строку из ресурса?===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CString m_Temp;&lt;br /&gt;
m_Temp.LoadString(ID_MYSTRING);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как поменять иконку у элемента (item) в CListCtrl?===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//заполняем структуру LVITEM&lt;br /&gt;
LVITEM lvItem;&lt;br /&gt;
memset(&amp;amp;lvItem,0,sizeof(lvItem));&lt;br /&gt;
	&lt;br /&gt;
lvItem.mask = LVIF_IMAGE;//меняться будет картинка&lt;br /&gt;
lvItem.iItem = ...;// индекс элемента списка (Zero-based)&lt;br /&gt;
lvItem.iSubItem = 0;&lt;br /&gt;
lvItem.iImage = ...; //индекс иконки (из списка контрола)&lt;br /&gt;
	&lt;br /&gt;
pList-&amp;gt;SetItem(&amp;amp; lvItem);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Имеется класс Class1, содержащий мембер типа указатель на Class2. В Class2 также имеется указатель на Class1. Компилятор выдаёт ошибку. Что надо делать?===&lt;br /&gt;
Предварительно объявляем класс Class2. Тогда компилятору будет известно, что описание класса Class2 будет встречено дальше, и станет возможным объявление указателей на класс до описания самого класса.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Class2;//предопределение&lt;br /&gt;
	&lt;br /&gt;
Class1&lt;br /&gt;
{&lt;br /&gt;
	Class2* p;&lt;br /&gt;
};&lt;br /&gt;
	&lt;br /&gt;
Class2&lt;br /&gt;
{&lt;br /&gt;
	Class1* p;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как переключить раскладку в другом (то есть в активном) процессе?===&lt;br /&gt;
Использовать функции:&lt;br /&gt;
   GetKeyboardLayout - определить текущую раскладку&lt;br /&gt;
   LoadKeyboardLayout - загрузить новую раскладку&lt;br /&gt;
&lt;br /&gt;
см.также&lt;br /&gt;
   VerLanguageName - получить строку с описанием языка&lt;br /&gt;
&lt;br /&gt;
(подробности - в MSDN)&lt;br /&gt;
===Как получить хендл контрола Edit зная его ID?===&lt;br /&gt;
Пусть контрол лежит на окне CMyWnd&lt;br /&gt;
Тогда:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void CMyWnd::некая_процедура()&lt;br /&gt;
{&lt;br /&gt;
	//для MFC&lt;br /&gt;
	CEdit* ed=(CEdit* ) GetDlgItem(ID_EDIT1);&lt;br /&gt;
	HWND hwnd=ed-&amp;gt;GetSafeHwnd();&lt;br /&gt;
	...&lt;br /&gt;
	&lt;br /&gt;
	//для Win32 API&lt;br /&gt;
	HWND hwnd=GetDlgItem(m_hWnd,ID_EDIT1);&lt;br /&gt;
	...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Как из дочернего окна закрыть приложение?===&lt;br /&gt;
Нужно послать родительскому окну (*pParent) сообщение WM_CLOSE:&lt;br /&gt;
 pParent-&amp;gt;PostMessage(WM_CLOSE);//MFC&lt;br /&gt;
или&lt;br /&gt;
 ::PostMessage(pParent-&amp;gt;m_hWnd,WM_CLOSE,(WPARAM)0,(LPARAM)0);//API&lt;br /&gt;
===Как корректно перевести BSTR в CString и наоборот?===&lt;br /&gt;
Нужно просто присвоить переменной типа CString переменную типа BSTR.&lt;br /&gt;
Оператор = класса CString сам всё переведёт.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//указатель на будущий буфер с BSTR.&lt;br /&gt;
//	(По сути, BSTR определён как &lt;br /&gt;
//	typedef WCHAR* BSTR;&lt;br /&gt;
//	то есть указатель на 16-битный символ юникод)&lt;br /&gt;
	&lt;br /&gt;
BSTR bstrHE=0;&lt;br /&gt;
	&lt;br /&gt;
CString Str=&amp;quot;мой текст&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
//Выделить память и загрузить адрес блока в bstrHE&lt;br /&gt;
bstrHE=Str.AllocSysString();&lt;br /&gt;
	&lt;br /&gt;
//...	&lt;br /&gt;
//тут работаем с bstrHE[]&lt;br /&gt;
//...&lt;br /&gt;
	&lt;br /&gt;
//освобождаем память&lt;br /&gt;
SysFreeString(bstrHE);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Как получить доступ к графическим ресурсам элементов текущей темы оформления Windows?===&lt;br /&gt;
Использовать функции&lt;br /&gt;
&lt;br /&gt;
OpenThemeData()&lt;br /&gt;
DrawThemeBackground()&lt;br /&gt;
DrawFrameControl()&lt;br /&gt;
CloseThemeData().&lt;br /&gt;
&lt;br /&gt;
(подробности - в MSDN)&lt;br /&gt;
===Имеется класс , производный от CDialog. Когда диалог в фокусе, нажатие на Enter или Esc приводит к закрытию диалога. Как это запретить?===&lt;br /&gt;
При нажатии Enter происходит выполнение команды IDOK,&lt;br /&gt;
при нажатии Esc - IDCANCEL.&lt;br /&gt;
Нужно переопределить в классе виртуальные функции OnOk() и OnCancel(),&lt;br /&gt;
которые соответственно вызываются для этих команд. При помощи&lt;br /&gt;
визарда эти функции добавить можно так: Положить на диалог две кнопки&lt;br /&gt;
с идентификаторами IDOK и IDCANCEL (при создании нового диалога они там&lt;br /&gt;
есть сразу), затем двойной клик по кнопке добавляет соответствующий&lt;br /&gt;
обработчик. В обработчиках надо удалить вызовы СDialog::OnOK() и&lt;br /&gt;
CDialog::OnCancel(), тогда диалог закрываться не будет.&lt;br /&gt;
Однако тогда диалог станет невозможно закрыть кнопкой с крестиком  :)&lt;br /&gt;
&lt;br /&gt;
Лечить так: добавить обработчик сообщения WM_CLOSE - OnClose(), и в нём&lt;br /&gt;
сделать вызов OnOk() или OnCancel() :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void CPlayersPropsDialog::OnClose() &lt;br /&gt;
{&lt;br /&gt;
	CDialog::OnClose();&lt;br /&gt;
	CDialog::OnCancel();//добавлено&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===VC++6. Я написал простейший макрос, а компилятор на него ругается. Ума не приложу, что за глюк?===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	#define my_macr(x,y,z) \&lt;br /&gt;
		z=\&lt;br /&gt;
		(x+y)*\&lt;br /&gt;
		(x-y)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Скорее всего после одного из символов соединения строк &amp;quot;\&amp;quot; имеется&lt;br /&gt;
пробел или табуляция. Их надо удалить. Можно найти их &amp;quot;наощупь&amp;quot;, а&lt;br /&gt;
можно включить показ непечатных символов в студии. Найти эту команду&lt;br /&gt;
можно так:&lt;br /&gt;
Tools-&amp;gt;Customize...-&amp;gt;вкладка Commands. В окошке Category выбрать&lt;br /&gt;
&amp;quot;Edit&amp;quot;, и среди кнопок справа найти кнопку, на которой написано &amp;quot;a.b&amp;quot;&lt;br /&gt;
Эту кнопку надо перетащить на одну из панелей инструментов студии.&lt;br /&gt;
&lt;br /&gt;
===Как получить список всех процесов, включая idle?===&lt;br /&gt;
Использовать функции&lt;br /&gt;
Process32First()&lt;br /&gt;
Precess32Next()&lt;br /&gt;
&lt;br /&gt;
===Как программно установить переменные окружения?===&lt;br /&gt;
Чтобы добавить или изменить их программно, необходимо воспользоваться&lt;br /&gt;
ключом реестра HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\&lt;br /&gt;
Session Manager\Environment, а затем отправить широковещательное&lt;br /&gt;
сообщение WM_SETTINGCHANGE. Это позволит приложениям узнать об&lt;br /&gt;
изменениях:&lt;br /&gt;
&lt;br /&gt;
::SendMessage(HWND_BROADCAST,WM_SETTINGCHANGE,0,0);&lt;br /&gt;
===Как сделать, чтобы у окна был черный фон?===&lt;br /&gt;
переопределить обработчик сообщения WM_CTLCOLOR - OnCtlColor() :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CBrush br(RGB(0,0,0));&lt;br /&gt;
	&lt;br /&gt;
HBRUSH CMyDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) &lt;br /&gt;
{&lt;br /&gt;
	HBRUSH hbr = CMyDlg::OnCtlColor(pDC, pWnd, nCtlColor);&lt;br /&gt;
	&lt;br /&gt;
	//фон диалога (или вьюшки)&lt;br /&gt;
	if(nCtlColor==CTLCOLOR_DLG)&lt;br /&gt;
	{&lt;br /&gt;
		return (HBRUSH)br;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	//фон статиков (если нужно)&lt;br /&gt;
	if(nCtlColor==CTLCOLOR_STATIC)&lt;br /&gt;
	{&lt;br /&gt;
		//делаем фон текста статика прозрачным&lt;br /&gt;
		pDC-&amp;gt;SetBkMode(TRANSPARENT);&lt;br /&gt;
		return (HBRUSH)br;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	return hbr;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Почему на моем компьютере экзешник, созданный в MFC запускается, а на других компьютерах - нет? Требует какую-то  dll-ку.===&lt;br /&gt;
Нужно выбирать режим Release :&lt;br /&gt;
&lt;br /&gt;
Menu-&amp;gt;Build-&amp;gt;Configurations...-&amp;gt;Release,&lt;br /&gt;
&lt;br /&gt;
и экзешник, соответственно, брать из папки Release проекта&lt;br /&gt;
===Как в диалог добавить меню?===&lt;br /&gt;
Надо сделать в ресурсах меню, затем вставить в диалог:&lt;br /&gt;
&lt;br /&gt;
открыть в редакторе диалог, в свойствах (во вкладке General, окошко Menu) указать идентивикатор ресурса меню.&lt;br /&gt;
При помощи визарда добавить для меню обработчики OnCommand() и OnUpdateСommand().&lt;br /&gt;
===Я добавил визардом меню в диалог. Добавил обработчики для пунктов меню. Но пункты работают, но OnUpdate для пунктов не вызывается - то есть не получается ни затенить, ни чек поставить. Что делать?===&lt;br /&gt;
В диалоге у меню апдейта не происходит сам, в отличие от мейнфрейма.&lt;br /&gt;
Для этого нужно сделать самим апдейт в обработчике сообщения WM_KICKIDLE.&lt;br /&gt;
Визардом обработчик не добавляется, поэтому можно переопределить виртуальную DefWindowProc() и там обработать:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;afxpriv.h&amp;gt;	//этот файл надо включить, там определёна WM_KICKIDLE&lt;br /&gt;
&lt;br /&gt;
LRESULT CMyDialog::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam) &lt;br /&gt;
{&lt;br /&gt;
	if(message==WM_KICKIDLE)&lt;br /&gt;
	{&lt;br /&gt;
		//делаем апдейт для всех пунктов меню&lt;br /&gt;
		CMenu* pMainMenu=GetMenu();&lt;br /&gt;
		if(pMainMenu)&lt;br /&gt;
		{&lt;br /&gt;
			CCmdUI cmdUI;&lt;br /&gt;
			for (UINT n=0; n &amp;lt; pMainMenu-&amp;gt;GetMenuItemCount(); ++n)&lt;br /&gt;
			{&lt;br /&gt;
				CMenu* pSubMenu = pMainMenu-&amp;gt;GetSubMenu(n);&lt;br /&gt;
				if(!pSubMenu)continue;&lt;br /&gt;
	&lt;br /&gt;
				cmdUI.m_nIndexMax = pSubMenu-&amp;gt;GetMenuItemCount();&lt;br /&gt;
				for (UINT i = 0; i &amp;lt; cmdUI.m_nIndexMax;++i)&lt;br /&gt;
				{&lt;br /&gt;
					cmdUI.m_nIndex = i;&lt;br /&gt;
					cmdUI.m_nID = pSubMenu-&amp;gt;GetMenuItemID(i);&lt;br /&gt;
					cmdUI.m_pMenu = pSubMenu;&lt;br /&gt;
					cmdUI.DoUpdate(this, FALSE);&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	return CDialog::DefWindowProc(message, wParam, lParam);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Как на Visual C++ 6.0 в Главном окне отключить системное меню (в левом верхнем углу) и кнопки(в правом верхнем углу) ?===&lt;br /&gt;
При создании окна нужно убрать стиль WS_SYSMENU&lt;br /&gt;
(теперь пользователь корректно может закрыть окно только Alt+F4  ,&lt;br /&gt;
ну или если вы предоставите ему дополнительную возможность сделать это )&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пример 1. (для SDI, MDI)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//этот обработчик уже добавлен визардом&lt;br /&gt;
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT&amp;amp; cs)&lt;br /&gt;
{&lt;br /&gt;
	if( !CFrameWnd::PreCreateWindow(cs) )&lt;br /&gt;
		return FALSE;&lt;br /&gt;
	// TODO: Modify the Window class or styles here by modifying&lt;br /&gt;
	//  the CREATESTRUCT cs&lt;br /&gt;
&lt;br /&gt;
	///////////////////////////////&lt;br /&gt;
	//добавленная часть&lt;br /&gt;
	{&lt;br /&gt;
		//убираем стиль&lt;br /&gt;
		cs.style&amp;amp;=~WS_SYSMENU;&lt;br /&gt;
	}&lt;br /&gt;
	///////////////////////////////&lt;br /&gt;
&lt;br /&gt;
	return TRUE;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Пример 2. (для диалога)&lt;br /&gt;
Если диалог описан в ресурсах, то в свойствах диалога убрать галочки&lt;br /&gt;
  &amp;quot;System menu&amp;quot;&lt;br /&gt;
  &amp;quot;Minimize box&amp;quot;&lt;br /&gt;
  &amp;quot;Maximize box&amp;quot;&lt;br /&gt;
===Хочу сделать так, чтобы пользователь не мог нажать на кнопку, пока программа не разрешит.===&lt;br /&gt;
Нужно применить метод класса CWnd::EnableWindow(...) для кнопки.&lt;br /&gt;
Значение параметра 0 делает кнопку неактивной, 1 - делает активной.&lt;br /&gt;
(кстати, не только для кнопки можно, а для любого класса, производного&lt;br /&gt;
от класса CWnd)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пример 1. Пусть имеется некий диалог, на нём лежит кнопка c ID == IDC_1.&lt;br /&gt;
в любом месте кода диалога (кроме конструктора и деструктора , хотя, если&lt;br /&gt;
проверить наличие валидного хендла диалога, как в примере, то ничего&lt;br /&gt;
страшного не будет и там)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//делаем кнопку неактивной&lt;br /&gt;
if(m_hWnd)&lt;br /&gt;
{&lt;br /&gt;
	CWnd* pw=0;&lt;br /&gt;
	pw=GetDlgItem(IDC_1);&lt;br /&gt;
	if(pw)pw-&amp;gt;EnableWindow(0);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Что означают сообщения, которые студия выводит при компиляции, вроде таких : Loaded 'C:\WINDOWS\SYSTEM\WSOCK32.DLL', no matching symbolic information found. ===&lt;br /&gt;
Это строка говорит о том, что студия не смогла найти отладочные&lt;br /&gt;
символы для WSOCK32.DLL. В этом нет ничего страшного, просто при наличии&lt;br /&gt;
отладочных символов в процессе отладки можно получить доступ к именам&lt;br /&gt;
функции из системных DLL. Например, вместо&lt;br /&gt;
 KERNEL32! 0x77E8B184() -&lt;br /&gt;
 увидим&lt;br /&gt;
 KERNEL32!CreateThread.&lt;br /&gt;
===Как обработать сообщения , которое приходит к некому контролу (скажем CEdit) ?===&lt;br /&gt;
Нужно произвести от CEdit свой класс, и в виртуальной процедуре класса WindowProc перехватить нужные сообщения.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
virtual LRESULT WindowProc(&lt;br /&gt;
   UINT message,&lt;br /&gt;
   WPARAM wParam,&lt;br /&gt;
   LPARAM lParam &lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Пример. Полностью выключаем, скажем, обработку сообщения WM_CHAR&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	LRESULT CMyEdit::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) &lt;br /&gt;
	{&lt;br /&gt;
		switch(message)&lt;br /&gt;
		{&lt;br /&gt;
			case WM_CHAR:&lt;br /&gt;
			{&lt;br /&gt;
				return 0;&lt;br /&gt;
			}&lt;br /&gt;
			break;&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		return CEdit::WindowProc(message, wParam, lParam);&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Чтобы связать экземпляр класса с контролом на форме, добавьте визардом для&lt;br /&gt;
контрола переменную класса (выбрав не Value а Control).&lt;br /&gt;
===Как настроить количество пробелов в табуляции?===&lt;br /&gt;
Tools-&amp;gt;Options-&amp;gt;Tabs-&amp;gt;Insert Spaces&lt;br /&gt;
(или  правой кнопкой мыши по тексту-&amp;gt; properties)&lt;br /&gt;
===Как автоматически расставить отступы?===&lt;br /&gt;
Выделить текст для форматирования, нажать Alt+F8&lt;br /&gt;
&lt;br /&gt;
Есть ещё программа Artistic Style, которая занимается&lt;br /&gt;
переформатированием кода&lt;br /&gt;
http://sourceforge.net/projects/astyle/&lt;br /&gt;
===Поиск границ блока===&lt;br /&gt;
&amp;quot;CTRL+ }&amp;quot; ищет парную фигурную скобку в тексте и переходит на неё&lt;br /&gt;
===Вертикальное выделение текста===&lt;br /&gt;
&amp;quot;Alt + выделение мышкой&amp;quot; - позволяет выделять вертикальные фрагменты текста&lt;br /&gt;
===Как узнать количество установленных в CListCtrl столбцов ?===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CListCtrl* pL=...; //указатель на переменную-контрол&lt;br /&gt;
&lt;br /&gt;
int count=pL-&amp;gt;GetHeaderCtrl()-&amp;gt;GetItemCount();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как получить иконку приложения?===&lt;br /&gt;
Если приложение запущено, то нужно найти его главное окно и&lt;br /&gt;
послать ему сообщение WM_GETICON.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//функция возвращант хендл иконки &lt;br /&gt;
LRESULT SendMessage(hWnd, WM_GETICON, wParam, 0);&lt;br /&gt;
&lt;br /&gt;
//hWnd == хендл окна приложения&lt;br /&gt;
//wParam == &lt;br /&gt;
//	1)==ICON_BIG - получить большую иконку&lt;br /&gt;
//	2)==ICON_SMALL - получить маленькую иконку&lt;br /&gt;
//	3)==ICON_SMALL2 - получить маленькую иконку, если она определена&lt;br /&gt;
//				в приложении. Если её нет, то маленькую иконку, &lt;br /&gt;
//				сгенерированную системой из большой иконки&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как в CString можно найти или вырезать часть строки?===&lt;br /&gt;
есть такие методы в CString :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//вырезает кусок строки&lt;br /&gt;
CString Mid(int nFirst) const;&lt;br /&gt;
CString Mid(int nFirst,  int nCount) const;&lt;br /&gt;
&lt;br /&gt;
//возвращает кусок строки (сначала или с конца)&lt;br /&gt;
CString Left(int nCount ) const;&lt;br /&gt;
CString Right(int nCount ) const;&lt;br /&gt;
&lt;br /&gt;
//возвращает начальный кусок строки, в котором есть только&lt;br /&gt;
//символы из набора,представленного в lpszCharSet&lt;br /&gt;
CString SpanIncluding(LPCTSTR lpszCharSet ) const;&lt;br /&gt;
&lt;br /&gt;
//возвращает начальный кусок строки, в котором нет&lt;br /&gt;
//символов из набора,представленного в lpszCharSet&lt;br /&gt;
CString SpanExcluding(LPCTSTR lpszCharSet ) const; &lt;br /&gt;
&lt;br /&gt;
//убирает &amp;quot;пробелоподобные&amp;quot; символы из самого начала строки&lt;br /&gt;
//(то есть - пробел, табуляцию (\t) , возврат каретки, перевод строки (/r/n))&lt;br /&gt;
void TrimLeft();&lt;br /&gt;
//убирает все повторы символа из самого начала строки&lt;br /&gt;
void TrimLeft(TCHAR chTarget );&lt;br /&gt;
//убирает из самого начала строки все символа из набора lpszTargets &lt;br /&gt;
void TrimLeft(LPCTSTR lpszTargets ); &lt;br /&gt;
&lt;br /&gt;
void TrimRight();&lt;br /&gt;
void TrimRight(TCHAR chTarget );&lt;br /&gt;
void TrimRight(LPCTSTR lpszTargets ); &lt;br /&gt;
&lt;br /&gt;
//поиск в строке&lt;br /&gt;
int Find( TCHAR ch ) const;&lt;br /&gt;
int Find( LPCTSTR lpszSub ) const;&lt;br /&gt;
int Find( TCHAR ch, int nStart ) const;&lt;br /&gt;
int Find( LPCTSTR pstr, int nStart ) const;&lt;br /&gt;
&lt;br /&gt;
//поиск, начиная с конца&lt;br /&gt;
int ReverseFind( TCHAR ch ) const;&lt;br /&gt;
&lt;br /&gt;
//поиск позиции первого символа, одного из набора,&lt;br /&gt;
// представленного в lpszCharSet&lt;br /&gt;
int FindOneOf( LPCTSTR lpszCharSet ) const;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Есть у меня CListBox и я в ходе выполнения программы добавляю в него строки. Но я не могу посмотреть что именно добавляется. Вывод результатов происходит в конце выполнения процедуры...===&lt;br /&gt;
Если нужно делать принудительную перерисовку окна во время&lt;br /&gt;
длительных вычислений, то нужно вызывать для окна, которое&lt;br /&gt;
надо перерисовать метод&lt;br /&gt;
  RedrawWindow()&lt;br /&gt;
с параметрами по умолчанию, или пару&lt;br /&gt;
  Invalidate(0);&lt;br /&gt;
  UpdateWindow();&lt;br /&gt;
Это приводит к пометке всего окна к перерисовке и отправлению&lt;br /&gt;
сообщения WM_PAINT в оконную процедуру в обход очереди&lt;br /&gt;
сообщений, вызывая немедленную перерисовку окна.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CWnd* pw=...;//окно , которое надо перерисовывать&lt;br /&gt;
&lt;br /&gt;
for(int i=0;i&amp;lt;10000)&lt;br /&gt;
{&lt;br /&gt;
	//меняется содержимое окна&lt;br /&gt;
	//...&lt;br /&gt;
&lt;br /&gt;
	//немедленная перерисовка&lt;br /&gt;
	pw-&amp;gt;Invalidate(0);&lt;br /&gt;
	pw-&amp;gt;UpdateWindow();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Я написал DLL , которую используют несколько приложений. Всё вроде работает, но когда происходит очередной вызов функции из DLL , почему то данные в функции обнуляются. С чем это связано ?===&lt;br /&gt;
Переменные и массивы в DLL, содержимое которых должно использоваться несколькими процессами, должны объявляться статическими. Статическая переменная или массив инициализируются только один раз в момент загрузки DLL.&lt;br /&gt;
Пример:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DWORD calltest()&lt;br /&gt;
{&lt;br /&gt;
	//будет выполнено только при первом вызове&lt;br /&gt;
	static DWORD callcount=0;&lt;br /&gt;
	static DWORD str[1000]={0}; &lt;br /&gt;
&lt;br /&gt;
	//будет выполняться каждый раз&lt;br /&gt;
	return ++callcount;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как открыть проекцию файла в память и как с ней работать?===&lt;br /&gt;
Как открыть проекцию файла в память и как с ней работать?&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HANDLE CreateFileMapping(&lt;br /&gt;
  HANDLE hFile,	//хендл уже открытого файла&lt;br /&gt;
  LPSECURITY_ATTRIBUTES lpAttributes,&lt;br /&gt;
  DWORD flProtect,	//способ открытия проекции&lt;br /&gt;
  DWORD dwMaximumSizeHigh,	//размер файла (старшие 4 байта , обычно==0)&lt;br /&gt;
  DWORD dwMaximumSizeLow,	//размер файла (младшие 4 байта)&lt;br /&gt;
  LPCTSTR lpName&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Доступ к созданной проекции производится процедурой&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LPVOID MapViewOfFile(&lt;br /&gt;
  HANDLE hFileMappingObject, //хендл проекции&lt;br /&gt;
  DWORD dwDesiredAccess,	//способ работы с проекцией&lt;br /&gt;
  DWORD dwFileOffsetHigh,&lt;br /&gt;
  DWORD dwFileOffsetLow, //смещение от начала файла (младшие 4 байта)&lt;br /&gt;
  SIZE_T dwNumberOfBytesToMap //длина в байтах (если ==0 - то весь файл)&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
далее с файлом можно работать как с обычным массивом в памяти.&lt;br /&gt;
&lt;br /&gt;
После работы с проекцией , её надо освободить процедурой&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
BOOL UnmapViewOfFile(&lt;br /&gt;
  LPCVOID lpBaseAddress //адрес, который вернула процедура MapViewOfFile&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Пример.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HANDLE hMapFile=0;//для проекции&lt;br /&gt;
&lt;br /&gt;
HANDLE hFile=...;//хендл уже открытого файла&lt;br /&gt;
DWORD dwdFileLen=...;//размер открытого файла&lt;br /&gt;
&lt;br /&gt;
//создаём проекцию &amp;quot;только для чтения&amp;quot;&lt;br /&gt;
hMapFile=::CreateFileMapping(hFile,0,PAGE_READONLY,0,dwdFileLen,0);&lt;br /&gt;
&lt;br /&gt;
//хендл hFile можно закрыть уже здесь, в принципе,&lt;br /&gt;
//но мы сделаем это позже&lt;br /&gt;
&lt;br /&gt;
//получаем доступ к проекции (тоже только для чтения)&lt;br /&gt;
BYTE* pbyFile=(BYTE*)::MapViewOfFile(hMapFile,FILE_MAP_READ,0,0,0);&lt;br /&gt;
&lt;br /&gt;
///////////////////&lt;br /&gt;
//тут работаем с массивом pbyFile[dwdFileLen] как с обычным,&lt;br /&gt;
//только не забываем, что он открыт только для чтения&lt;br /&gt;
//...&lt;br /&gt;
//...&lt;br /&gt;
//...&lt;br /&gt;
///////////////////&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//отключаем файл данных от адресного пространства&lt;br /&gt;
UnmapViewOfFile(pbyFile);&lt;br /&gt;
&lt;br /&gt;
//освобождаем хендл проекции&lt;br /&gt;
CloseHandle(hMapFile)&lt;br /&gt;
&lt;br /&gt;
//освобождаем хендл открытого файла&lt;br /&gt;
CloseHandle(hFile);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Использую MFC Grid control 2.25 , не получается отобразить картинку в ячейке. Как это делается ?===&lt;br /&gt;
Нужно создать список изображений (CImageList) , затем передать указатель на список в контрол. Поскольку контрол лишь копирует указатель , список должен создаваться динамически, либо быть членом класса, экземпляр которого существует всё время работы контрола.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 m_GridMarket&lt;br /&gt;
CImageList m_ImageList;&lt;br /&gt;
CGridCtrL m_Grid1&lt;br /&gt;
...&lt;br /&gt;
...&lt;br /&gt;
//неким образом создаётся список&lt;br /&gt;
m_ImageList.Create(...);&lt;br /&gt;
//...&lt;br /&gt;
&lt;br /&gt;
//вставляем в контрол&lt;br /&gt;
m_Grid1.SetImageList(&amp;amp;m_ImageList);&lt;br /&gt;
&lt;br /&gt;
//&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как при помощи IPicture отобразить картинку из файла? ===&lt;br /&gt;
Пример - несложная функция, отображающая картинку из файла&lt;br /&gt;
&lt;br /&gt;
поддерживаются форматы&lt;br /&gt;
BMP, GIF, JPEG, PNG, TIFF, EMF&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;quot;atlconv.h&amp;quot;&lt;br /&gt;
#define HandleIsValid(H) (H!=(HANDLE)-1 &amp;amp;&amp;amp; H!=(HANDLE)0)&lt;br /&gt;
&lt;br /&gt;
//*pDestDC - CDC, на который предполагается вывод картинки&lt;br /&gt;
//pchzFilePath - путь к файлу&lt;br /&gt;
//pWid - (возвращает) ширина картинки&lt;br /&gt;
//pHig - (возвращает) высота картинки&lt;br /&gt;
bool DrawBitmapFromFile(CDC* pDestDC,const char* pchzFilePath,int *pWid=0,int *pHig=0)&lt;br /&gt;
{&lt;br /&gt;
	bool result=false;&lt;br /&gt;
&lt;br /&gt;
	if(pWid)*pWid=0;&lt;br /&gt;
	if(pHig)*pHig=0;&lt;br /&gt;
&lt;br /&gt;
	int Wid=0;&lt;br /&gt;
	int Hig=0;&lt;br /&gt;
&lt;br /&gt;
	IPicture* pPic=0;&lt;br /&gt;
	try&lt;br /&gt;
	{&lt;br /&gt;
		IPicture* ptmpPic=0;&lt;br /&gt;
		USES_CONVERSION;&lt;br /&gt;
		HRESULT hr;&lt;br /&gt;
&lt;br /&gt;
		CString txt=pchzFilePath;&lt;br /&gt;
		hr= ::OleLoadPicturePath(&lt;br /&gt;
			const_cast&amp;lt;LPOLESTR&amp;gt;(T2COLE(txt)),&lt;br /&gt;
			0,0,0,IID_IPicture,&lt;br /&gt;
			reinterpret_cast&amp;lt;void **&amp;gt;(&amp;amp;ptmpPic)&lt;br /&gt;
			);&lt;br /&gt;
&lt;br /&gt;
		if(hr==S_OK &amp;amp;&amp;amp; ptmpPic)&lt;br /&gt;
		{&lt;br /&gt;
			pPic=ptmpPic;&lt;br /&gt;
		}&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			throw 0;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		OLE_XPOS_HIMETRIC cxSrc;&lt;br /&gt;
		OLE_YPOS_HIMETRIC cySrc;&lt;br /&gt;
&lt;br /&gt;
		if(S_OK!=pPic-&amp;gt;get_Width(&amp;amp;cxSrc))throw 0;&lt;br /&gt;
		if(S_OK!=pPic-&amp;gt;get_Height(&amp;amp;cySrc))throw 0;&lt;br /&gt;
&lt;br /&gt;
		Wid=cxSrc/26;&lt;br /&gt;
		Hig=cySrc/26;&lt;br /&gt;
&lt;br /&gt;
		//рисуем&lt;br /&gt;
		if(S_OK !=pPic-&amp;gt;Render(pDestDC-&amp;gt;GetSafeHdc(),&lt;br /&gt;
			0,Hig,Wid,-Hig,0,0,cxSrc,cySrc,0))throw 0;&lt;br /&gt;
	}&lt;br /&gt;
	catch(...)&lt;br /&gt;
	{&lt;br /&gt;
		result=false;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if(pPic)&lt;br /&gt;
	{&lt;br /&gt;
		pPic-&amp;gt;Release();&lt;br /&gt;
		pPic=0;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	if(pWid)*pWid=Wid;&lt;br /&gt;
	if(pHig)*pHig=Hig;&lt;br /&gt;
&lt;br /&gt;
	return result;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===У меня модальное диалоговое окно, в нем поле редактирования мультилайновое, т.е. чтобы перейти на новую строку надо нажать ентер, но вызывается стандартный обработчик диалогового окна. Подскажите, что делать?===&lt;br /&gt;
Нужно в редакторе ресурсов поставить для CEdit окошка галочку&lt;br /&gt;
свойства WantReturn,&lt;br /&gt;
&lt;br /&gt;
или добавить ES_WANTRETURN при создании CEdit контрола динамически.&lt;br /&gt;
===Как выводят картинку-логотип(splash screen) при запуске программы? То есть, когда загружается программа на экран выводится картинка, потом она исчезает(загрузка программы закончена) и пользователь может приступать к работе ===&lt;br /&gt;
Для этого используется класс, производный от CDialog. Этот диалог после создания показывает себя на экран, выводя на себя рисунок. Также запускает таймет, по срабатывани которого диалог гасится. Создаётся диалог InitInstance приложения.&lt;br /&gt;
&lt;br /&gt;
В VC6++ также есть уже готовый компонент&lt;br /&gt;
Project-&amp;gt;Add To Project -&amp;gt; Components and Controls-&amp;gt;(в папке &amp;quot;Visual C++ Components&amp;quot; есть SplashScreen.)&lt;br /&gt;
===Как сделать, чтобы при выпадении списка у ComboBox была не одна строка, а больше, вроде все свойства покрутил, не помогает Вместо выпадающего списка одна строка и скролл...===&lt;br /&gt;
В редакторе ресурсов надо щелкнуть в комбобоксе на треугольнике - появляется рамка для растягивания вниз - размер выпадающего списка.&lt;br /&gt;
===В VC++.net , что делать после того, как на форму установил ActiiveX ListView, как объявить класс и переменную для этого элемента?===&lt;br /&gt;
Щёлкнуть правой кнопкой мыши на элементе , в меню - add variable или add class&lt;br /&gt;
===Как вставить данные в буфер обмена (Clipboard) ? Как их оттуда вытащить ?===&lt;br /&gt;
&lt;br /&gt;
1) копирование в буфер обмена:&lt;br /&gt;
&lt;br /&gt;
  1.Готовим данные&lt;br /&gt;
    а.Выделяем память из кучи,  вызывая GlobalAlloc()&lt;br /&gt;
    б.Получаем указатель на выделенную память, вызывая GlobalLock()&lt;br /&gt;
    в.Заполняем данные&lt;br /&gt;
    г.Освобождаем указатель , вызывая GlobalUnlock();&lt;br /&gt;
&lt;br /&gt;
  2.Открываем буфер обмена , вызывая OpenClipboard();&lt;br /&gt;
  3.Очищаем буфер, вызывая EmptyClipboard();&lt;br /&gt;
  4.Вызываем SetClipboardData() один раз для каждого формата&lt;br /&gt;
      вставляемых данных (имеется в виду - если одни и те же&lt;br /&gt;
      данные представлены в разных форматах, и приложение&lt;br /&gt;
      может эти форматы создать)&lt;br /&gt;
  5.Закрываем буфер, вызывая CloseClipboard();&lt;br /&gt;
  6.ВЫЗЫВАТЬ GlobalFree() НЕ НУЖНО , в этом случае это&lt;br /&gt;
      предоставлено системе&lt;br /&gt;
&lt;br /&gt;
Скажем, хотим поместить в буфер обмена туда текст.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	//готовим данные&lt;br /&gt;
	//выделяем из кучи память для данных&lt;br /&gt;
	HANDLE hglbCopy = GlobalAlloc(GMEM_MOVEABLE,10);&lt;br /&gt;
	if(!hglbCopy)return;&lt;br /&gt;
&lt;br /&gt;
	//получаем указатель&lt;br /&gt;
	void* lpStr = GlobalLock(hglbCopy);&lt;br /&gt;
	if(!lpStr)return;&lt;br /&gt;
&lt;br /&gt;
	//заполняем данные&lt;br /&gt;
	strcpy((char*)lpStr,&amp;quot;my text&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	//освобождаем указатель&lt;br /&gt;
	GlobalUnlock(hglbCopy);&lt;br /&gt;
	lpStr=0;&lt;br /&gt;
&lt;br /&gt;
	//открываем буфер обмена&lt;br /&gt;
	OpenClipboard();&lt;br /&gt;
	//очищаем&lt;br /&gt;
	EmptyClipboard();&lt;br /&gt;
&lt;br /&gt;
	//текстовый формат&lt;br /&gt;
	SetClipboardData(CF_TEXT,hglbCopy);&lt;br /&gt;
&lt;br /&gt;
	//закрываем буфер&lt;br /&gt;
	CloseClipboard();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
2) извлечение из буфера обмена&lt;br /&gt;
&lt;br /&gt;
  1.Проверяем, что поддерживается нужный формат данных,&lt;br /&gt;
      вызывая IsClipboardFormatAvailable()&lt;br /&gt;
  2.Открываем буфер обмена , вызывая OpenClipboard();&lt;br /&gt;
  3.Достаём данные&lt;br /&gt;
   а.Получаем из буфера хендл требуемого формата,&lt;br /&gt;
      вызывая GetClipboardData()&lt;br /&gt;
    б.Получаем указатель на выделенную память, вызывая GlobalLock()&lt;br /&gt;
    в.Работаем с данными&lt;br /&gt;
    г.Освобождаем указатель , вызывая GlobalUnlock();&lt;br /&gt;
  4.Закрываем буфер, вызывая CloseClipboard();&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	//Проверяем, что поддерживается нужный формат данных,&lt;br /&gt;
	if(!IsClipboardFormatAvailable(CF_TEXT))return;&lt;br /&gt;
&lt;br /&gt;
	//открываем буфер обмена&lt;br /&gt;
	OpenClipboard();&lt;br /&gt;
&lt;br /&gt;
	//достаём данные&lt;br /&gt;
&lt;br /&gt;
	//текстовый формат&lt;br /&gt;
	HANDLE hglbCopy = GetClipboardData(CF_TEXT);&lt;br /&gt;
	if(!hglbCopy)return;&lt;br /&gt;
&lt;br /&gt;
	//получаем указатель&lt;br /&gt;
	void* lpStr = GlobalLock(hglbCopy);&lt;br /&gt;
	if(!lpStr)return;&lt;br /&gt;
&lt;br /&gt;
	//читаем данные&lt;br /&gt;
	char data[10];&lt;br /&gt;
	memmove(data,lpStr,sizeof(data));&lt;br /&gt;
&lt;br /&gt;
	//освобождаем указатель&lt;br /&gt;
	GlobalUnlock(hglbCopy);&lt;br /&gt;
	lpStr=0;&lt;br /&gt;
&lt;br /&gt;
	//закрываем буфер&lt;br /&gt;
	CloseClipboard();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как получить полный путь к экзешнику из самой программы ?===&lt;br /&gt;
В командную строку первым параметром система всегда передаёт заключённый в кавычки полный путь к файлу запущенной программы Достаём путь таким образом :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
BOOL CMyApp::InitInstance()&lt;br /&gt;
{&lt;br /&gt;
	//добыча полного имени экзешника&lt;br /&gt;
	CString csFullExeName;&lt;br /&gt;
	{&lt;br /&gt;
		CString csAppName=GetCommandLine();&lt;br /&gt;
		csAppName.Delete(0,1);&lt;br /&gt;
		csAppName.Replace('\&amp;quot;','\0');&lt;br /&gt;
		csFullExeName=(const char*)csAppName;&lt;br /&gt;
	}&lt;br /&gt;
	//теперь csFullExeName - содержит искомый путь&lt;br /&gt;
&lt;br /&gt;
	//...&lt;br /&gt;
	//...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Каким способом можно exe файл может заменить самого себя? То есть, моя программа обновляется, например, через Internet, и хочет обновить свой exe-файл. Но так как он в данный момент запущен - это будет, естественно, запрещено. Как это можно проще всего сделать?===&lt;br /&gt;
Один из способов - сделать копию экзешника и из него обновиться&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define def_exeNAMEup	&amp;quot;c:\\myprog_update.exe&amp;quot;&lt;br /&gt;
#define def_exeNAMEdnld	&amp;quot;c:\\myprog_downloaded.exe&amp;quot;&lt;br /&gt;
#define def_keyUdate	&amp;quot;/update&amp;quot;&lt;br /&gt;
&lt;br /&gt;
void CTESTFAQApp::UpdateItself()&lt;br /&gt;
{&lt;br /&gt;
	//добыча полного имени экзешника&lt;br /&gt;
	CString csFullExeName;&lt;br /&gt;
	{&lt;br /&gt;
		CString csAppName=GetCommandLine();&lt;br /&gt;
		csAppName.Delete(0,1);&lt;br /&gt;
		csAppName.Replace('\&amp;quot;','\0');&lt;br /&gt;
		csFullExeName=(const char*)csAppName;&lt;br /&gt;
	}&lt;br /&gt;
	//теперь csFullExeName - содержит искомый путь&lt;br /&gt;
&lt;br /&gt;
	//делаем копию экзешника с другим именем&lt;br /&gt;
	CopyFile(csFullExeName,def_exeNAMEup,0);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	//передаём в параметры нового процесса ключ и путь к текущему файлу&lt;br /&gt;
	CString csParams=def_keyUdate;&lt;br /&gt;
	csParams+=&amp;quot; &amp;quot;;&lt;br /&gt;
	csParams+=csFullExeName;&lt;br /&gt;
&lt;br /&gt;
	//запускаем копию&lt;br /&gt;
	STARTUPINFO si;&lt;br /&gt;
	PROCESS_INFORMATION pi;&lt;br /&gt;
	ZeroMemory(&amp;amp;si,sizeof(si));&lt;br /&gt;
	si.cb = sizeof(si);&lt;br /&gt;
	ZeroMemory(&amp;amp;pi,sizeof(pi));&lt;br /&gt;
	if(CreateProcess(def_exeNAMEup,def_keyUdate,0,0,0,0,0,0,&amp;amp;si,&amp;amp;pi))&lt;br /&gt;
	{&lt;br /&gt;
		//завершаем текущий процесс&lt;br /&gt;
		ExitFromMyApp();&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void CTESTFAQApp::ExitFromMyApp()&lt;br /&gt;
{&lt;br /&gt;
	exit(0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
BOOL CTESTFAQApp::InitInstance()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
	//смотрим, не запустили ли для апдейта?&lt;br /&gt;
&lt;br /&gt;
	CString txt;&lt;br /&gt;
	txt=m_lpCmdLine;&lt;br /&gt;
	if(txt.Find(def_keyUdate)==0)&lt;br /&gt;
	{&lt;br /&gt;
		//делаем айдейт&lt;br /&gt;
		txt.Replace(def_keyUdate,&amp;quot;&amp;quot;);&lt;br /&gt;
		txt.TrimLeft();&lt;br /&gt;
&lt;br /&gt;
		CString csFullExeName=txt;&lt;br /&gt;
&lt;br /&gt;
		//берём откуда то уже скачанный файл обновления&lt;br /&gt;
		//...&lt;br /&gt;
		CString csFull_Downloaded_ExeName=def_exeNAMEdnld;&lt;br /&gt;
&lt;br /&gt;
		//копируем файл (обновляем старый то есть)&lt;br /&gt;
		CopyFile(csFull_Downloaded_ExeName,csFullExeName,0);&lt;br /&gt;
&lt;br /&gt;
		//запускаем обновлённого мученника&lt;br /&gt;
		STARTUPINFO si;&lt;br /&gt;
		PROCESS_INFORMATION pi;&lt;br /&gt;
		ZeroMemory(&amp;amp;si,sizeof(si));&lt;br /&gt;
		si.cb = sizeof(si);&lt;br /&gt;
		ZeroMemory(&amp;amp;pi,sizeof(pi));&lt;br /&gt;
		if(CreateProcess(csFullExeName,0,0,0,0,0,0,0,&amp;amp;si,&amp;amp;pi))&lt;br /&gt;
&lt;br /&gt;
		ExitFromMyApp();&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
	//...&lt;br /&gt;
	//...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Есть строка символов (страничка из Инета) в кодировке utf-8 (строка char*). Как мне ее получить в формате String&lt;br /&gt;
или в char* в кодировке ANSI (cp 1251) ?===&lt;br /&gt;
Можно перевести строку из UTF8 в Unicode, затем из Unicode в 1251&lt;br /&gt;
&lt;br /&gt;
Ниже приведена структура, содержащая процедуры перекодирования,&lt;br /&gt;
а также процедуру с примером использования&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//описание структуры&lt;br /&gt;
struct coder&lt;br /&gt;
{&lt;br /&gt;
	//utf8-&amp;gt;unicode&lt;br /&gt;
	static wchar_t* utf8_to_unicode__dontForgetDeleteArr(const char *utf8_string)&lt;br /&gt;
	{&lt;br /&gt;
		wchar_t* pRes=0;&lt;br /&gt;
		int res_len=0;&lt;br /&gt;
&lt;br /&gt;
		//тест на возможность преобразования&lt;br /&gt;
		res_len=MultiByteToWideChar(CP_UTF8,0,utf8_string,-1,0,0);&lt;br /&gt;
		if(!res_len)return 0;&lt;br /&gt;
&lt;br /&gt;
		//выделяем память&lt;br /&gt;
		pRes = new wchar_t[res_len];&lt;br /&gt;
		if(!pRes)return 0;&lt;br /&gt;
&lt;br /&gt;
		//преобразование&lt;br /&gt;
		if(!MultiByteToWideChar(CP_UTF8,0,utf8_string,-1,pRes,res_len))&lt;br /&gt;
		{&lt;br /&gt;
			delete [] pRes;&lt;br /&gt;
			return 0;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		return pRes;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	//unicode-&amp;gt;1251&lt;br /&gt;
	static char * unicode_to_1251__dontForgetDeleteArr(const wchar_t *unicode_string)&lt;br /&gt;
	{&lt;br /&gt;
		char* pRes=0;&lt;br /&gt;
		int res_len=0;&lt;br /&gt;
&lt;br /&gt;
		//тест на возможность преобразования&lt;br /&gt;
		res_len = WideCharToMultiByte(1251,0,unicode_string,-1,0,0,0,0);&lt;br /&gt;
		if(!res_len)return 0;&lt;br /&gt;
&lt;br /&gt;
		//выделяем память&lt;br /&gt;
		pRes=new char[res_len];&lt;br /&gt;
		if(!pRes)return 0;&lt;br /&gt;
&lt;br /&gt;
		//преобразование&lt;br /&gt;
		if(!WideCharToMultiByte(1251,0,unicode_string,-1,pRes,res_len,0,0))&lt;br /&gt;
		{&lt;br /&gt;
			delete [] pRes;&lt;br /&gt;
			return 0;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		return pRes;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	//процедура с примером&lt;br /&gt;
	static void Example()&lt;br /&gt;
	{&lt;br /&gt;
		wchar_t* unicode_string=0;&lt;br /&gt;
		char* cp1251_string=0;&lt;br /&gt;
&lt;br /&gt;
		//исходный текст&lt;br /&gt;
		char utf8_string[] = &amp;quot;UTF-8 + СЂСѓСЃСЃРєРёР№ С‚РµРєСЃС‚&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
		for(;;)&lt;br /&gt;
		{&lt;br /&gt;
&lt;br /&gt;
			unicode_string=utf8_to_unicode__dontForgetDeleteArr(utf8_string);&lt;br /&gt;
			if(!unicode_string)&lt;br /&gt;
			{&lt;br /&gt;
				AfxMessageBox(&amp;quot;Не удалось конвертировать в unicode!&amp;quot;);&lt;br /&gt;
				break;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			cp1251_string = unicode_to_1251__dontForgetDeleteArr(unicode_string);&lt;br /&gt;
&lt;br /&gt;
			if(!cp1251_string)&lt;br /&gt;
			{&lt;br /&gt;
				AfxMessageBox(&amp;quot;Не удалось конвертировать из unicode!&amp;quot;);&lt;br /&gt;
				break;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			break;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		//cp1251_string - результат&lt;br /&gt;
		AfxMessageBox(cp1251_string);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
		//не забываем удалить массивы&lt;br /&gt;
		if(unicode_string)&lt;br /&gt;
		{&lt;br /&gt;
			delete [] unicode_string;&lt;br /&gt;
			unicode_string=0;&lt;br /&gt;
		}&lt;br /&gt;
		if(cp1251_string)&lt;br /&gt;
		{&lt;br /&gt;
			delete [] cp1251_string;&lt;br /&gt;
			cp1251_string=0;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
//вызов примера&lt;br /&gt;
coder::Example();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как организовать взаимодействие программы на VC.net с Access-овской базой данных?===&lt;br /&gt;
Проще всего подключить ADO компоненты и сделать все на них.&lt;br /&gt;
Компоненты  ADO (ADODC,DATAGRID и т.п.) это ActiveX.&lt;br /&gt;
В редакторе ресурсов, во всплывающем меню, есть Insert ActiveX Control -&amp;gt; открывается список всех компоент,&lt;br /&gt;
зарегистрированых на машине. Нужно найти компоненты (Это компоненты от MS и они помечены (OLEDB)) и вставить их в диалог. Для того что бы иметь возможность управлять ими, нужно импортировать обертки для них, это делается при помощи ClassWisard, там есть импорт-&amp;gt;класс-&amp;gt;указать файл с компоентой (OSX).&lt;br /&gt;
Появляется список всех классов, объявленых внутри.&lt;br /&gt;
Проставляем галочки, нажимаем ОК.&lt;br /&gt;
&lt;br /&gt;
[[Category:FAQ]]&lt;/div&gt;</summary>
		<author><name>Mczim</name></author>	</entry>

	<entry>
		<id>https://wiki.shelek.ru/index.php?title=FAQ:WinAPI,_VCPP_Part_3&amp;diff=407</id>
		<title>FAQ:WinAPI, VCPP Part 3</title>
		<link rel="alternate" type="text/html" href="https://wiki.shelek.ru/index.php?title=FAQ:WinAPI,_VCPP_Part_3&amp;diff=407"/>
				<updated>2008-08-14T18:36:34Z</updated>
		
		<summary type="html">&lt;p&gt;Mczim: пробел перед знаком вопроса в заголовке&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Имеется приложение на основе CRichEditView. Как узнать, что пользователь меняет текст?===&lt;br /&gt;
Добавить обработчик сообщения EN_CHANGE. Сообщение генерируется CRichEditView каждый раз, когда пользователь изменяет текст в окне CRichEditView&lt;br /&gt;
===Чем метод CArray::GetSize отличается от метода CArray::GetCount?===&lt;br /&gt;
Абсолютно ничем. (Скорее всего, были предыдущие библиотеки, в которых функции, одинаковые по смыслу, имели разные имена. Поэтому в целях совместимости оставили оба)&lt;br /&gt;
===Как загрузить строку из ресурса?===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CString m_Temp;&lt;br /&gt;
m_Temp.LoadString(ID_MYSTRING);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как поменять иконку у элемента (item) в CListCtrl?===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//заполняем структуру LVITEM&lt;br /&gt;
LVITEM lvItem;&lt;br /&gt;
memset(&amp;amp;lvItem,0,sizeof(lvItem));&lt;br /&gt;
	&lt;br /&gt;
lvItem.mask = LVIF_IMAGE;//меняться будет картинка&lt;br /&gt;
lvItem.iItem = ...;// индекс элемента списка (Zero-based)&lt;br /&gt;
lvItem.iSubItem = 0;&lt;br /&gt;
lvItem.iImage = ...; //индекс иконки (из списка контрола)&lt;br /&gt;
	&lt;br /&gt;
pList-&amp;gt;SetItem(&amp;amp; lvItem);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Имеется класс Class1, содержащий мембер типа указатель на Class2. В Class2 также имеется указатель на Class1. Компилятор выдаёт ошибку. Что надо делать?===&lt;br /&gt;
Предварительно объявляем класс Class2. Тогда компилятору будет известно, что описание класса Class2 будет встречено дальше, и станет возможным объявление указателей на класс до описания самого класса.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Class2;//предопределение&lt;br /&gt;
	&lt;br /&gt;
Class1&lt;br /&gt;
{&lt;br /&gt;
	Class2* p;&lt;br /&gt;
};&lt;br /&gt;
	&lt;br /&gt;
Class2&lt;br /&gt;
{&lt;br /&gt;
	Class1* p;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как переключить раскладку в другом (то есть в активном) процессе?===&lt;br /&gt;
Использовать функции:&lt;br /&gt;
   GetKeyboardLayout - определить текущую раскладку&lt;br /&gt;
   LoadKeyboardLayout - загрузить новую раскладку&lt;br /&gt;
&lt;br /&gt;
см.также&lt;br /&gt;
   VerLanguageName - получить строку с описанием языка&lt;br /&gt;
&lt;br /&gt;
(подробности - в MSDN)&lt;br /&gt;
===Как получить хендл контрола Edit зная его ID?===&lt;br /&gt;
Пусть контрол лежит на окне CMyWnd&lt;br /&gt;
Тогда:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void CMyWnd::некая_процедура()&lt;br /&gt;
{&lt;br /&gt;
	//для MFC&lt;br /&gt;
	CEdit* ed=(CEdit* ) GetDlgItem(ID_EDIT1);&lt;br /&gt;
	HWND hwnd=ed-&amp;gt;GetSafeHwnd();&lt;br /&gt;
	...&lt;br /&gt;
	&lt;br /&gt;
	//для Win32 API&lt;br /&gt;
	HWND hwnd=GetDlgItem(m_hWnd,ID_EDIT1);&lt;br /&gt;
	...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Как из дочернего окна закрыть приложение?===&lt;br /&gt;
Нужно послать родительскому окну (*pParent) сообщение WM_CLOSE:&lt;br /&gt;
 pParent-&amp;gt;PostMessage(WM_CLOSE);//MFC&lt;br /&gt;
или&lt;br /&gt;
 ::PostMessage(pParent-&amp;gt;m_hWnd,WM_CLOSE,(WPARAM)0,(LPARAM)0);//API&lt;br /&gt;
===Как корректно перевести BSTR в CString и наоборот?===&lt;br /&gt;
Нужно просто присвоить переменной типа CString переменную типа BSTR.&lt;br /&gt;
Оператор = класса CString сам всё переведёт.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//указатель на будущий буфер с BSTR.&lt;br /&gt;
//	(По сути, BSTR определён как &lt;br /&gt;
//	typedef WCHAR* BSTR;&lt;br /&gt;
//	то есть указатель на 16-битный символ юникод)&lt;br /&gt;
	&lt;br /&gt;
BSTR bstrHE=0;&lt;br /&gt;
	&lt;br /&gt;
CString Str=&amp;quot;мой текст&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
//Выделить память и загрузить адрес блока в bstrHE&lt;br /&gt;
bstrHE=Str.AllocSysString();&lt;br /&gt;
	&lt;br /&gt;
//...	&lt;br /&gt;
//тут работаем с bstrHE[]&lt;br /&gt;
//...&lt;br /&gt;
	&lt;br /&gt;
//освобождаем память&lt;br /&gt;
SysFreeString(bstrHE);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Как получить доступ к графическим ресурсам элементов текущей темы оформления Windows?===&lt;br /&gt;
Использовать функции&lt;br /&gt;
&lt;br /&gt;
OpenThemeData()&lt;br /&gt;
DrawThemeBackground()&lt;br /&gt;
DrawFrameControl()&lt;br /&gt;
CloseThemeData().&lt;br /&gt;
&lt;br /&gt;
(подробности - в MSDN)&lt;br /&gt;
===Имеется класс , производный от CDialog. Когда диалог в фокусе, нажатие на Enter или Esc приводит к закрытию диалога. Как это запретить?===&lt;br /&gt;
При нажатии Enter происходит выполнение команды IDOK,&lt;br /&gt;
при нажатии Esc - IDCANCEL.&lt;br /&gt;
Нужно переопределить в классе виртуальные функции OnOk() и OnCancel(),&lt;br /&gt;
которые соответственно вызываются для этих команд. При помощи&lt;br /&gt;
визарда эти функции добавить можно так: Положить на диалог две кнопки&lt;br /&gt;
с идентификаторами IDOK и IDCANCEL (при создании нового диалога они там&lt;br /&gt;
есть сразу), затем двойной клик по кнопке добавляет соответствующий&lt;br /&gt;
обработчик. В обработчиках надо удалить вызовы СDialog::OnOK() и&lt;br /&gt;
CDialog::OnCancel(), тогда диалог закрываться не будет.&lt;br /&gt;
Однако тогда диалог станет невозможно закрыть кнопкой с крестиком  :)&lt;br /&gt;
&lt;br /&gt;
Лечить так: добавить обработчик сообщения WM_CLOSE - OnClose(), и в нём&lt;br /&gt;
сделать вызов OnOk() или OnCancel() :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void CPlayersPropsDialog::OnClose() &lt;br /&gt;
{&lt;br /&gt;
	CDialog::OnClose();&lt;br /&gt;
	CDialog::OnCancel();//добавлено&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===VC++6. Я написал простейший макрос, а компилятор на него ругается. Ума не приложу, что за глюк?===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	#define my_macr(x,y,z) \&lt;br /&gt;
		z=\&lt;br /&gt;
		(x+y)*\&lt;br /&gt;
		(x-y)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Скорее всего после одного из символов соединения строк &amp;quot;\&amp;quot; имеется&lt;br /&gt;
пробел или табуляция. Их надо удалить. Можно найти их &amp;quot;наощупь&amp;quot;, а&lt;br /&gt;
можно включить показ непечатных символов в студии. Найти эту команду&lt;br /&gt;
можно так:&lt;br /&gt;
Tools-&amp;gt;Customize...-&amp;gt;вкладка Commands. В окошке Category выбрать&lt;br /&gt;
&amp;quot;Edit&amp;quot;, и среди кнопок справа найти кнопку, на которой написано &amp;quot;a.b&amp;quot;&lt;br /&gt;
Эту кнопку надо перетащить на одну из панелей инструментов студии.&lt;br /&gt;
&lt;br /&gt;
===Как получить список всех процесов, включая idle?===&lt;br /&gt;
Использовать функции&lt;br /&gt;
Process32First()&lt;br /&gt;
Precess32Next()&lt;br /&gt;
&lt;br /&gt;
===Как программно установить переменные окружения?===&lt;br /&gt;
Чтобы добавить или изменить их программно, необходимо воспользоваться&lt;br /&gt;
ключом реестра HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\&lt;br /&gt;
Session Manager\Environment, а затем отправить широковещательное&lt;br /&gt;
сообщение WM_SETTINGCHANGE. Это позволит приложениям узнать об&lt;br /&gt;
изменениях:&lt;br /&gt;
&lt;br /&gt;
::SendMessage(HWND_BROADCAST,WM_SETTINGCHANGE,0,0);&lt;br /&gt;
===Как сделать,чтобы у окна был черный фон?===&lt;br /&gt;
переопределить обработчик сообщения WM_CTLCOLOR - OnCtlColor() :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CBrush br(RGB(0,0,0));&lt;br /&gt;
	&lt;br /&gt;
HBRUSH CMyDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) &lt;br /&gt;
{&lt;br /&gt;
	HBRUSH hbr = CMyDlg::OnCtlColor(pDC, pWnd, nCtlColor);&lt;br /&gt;
	&lt;br /&gt;
	//фон диалога (или вьюшки)&lt;br /&gt;
	if(nCtlColor==CTLCOLOR_DLG)&lt;br /&gt;
	{&lt;br /&gt;
		return (HBRUSH)br;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	//фон статиков (если нужно)&lt;br /&gt;
	if(nCtlColor==CTLCOLOR_STATIC)&lt;br /&gt;
	{&lt;br /&gt;
		//делаем фон текста статика прозрачным&lt;br /&gt;
		pDC-&amp;gt;SetBkMode(TRANSPARENT);&lt;br /&gt;
		return (HBRUSH)br;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	return hbr;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Почему на моем компьютере экзешник, созданный в MFC запускается, а на других компьютерах - нет? Требует какую-то  dll-ку.===&lt;br /&gt;
Нужно выбирать режим Release :&lt;br /&gt;
&lt;br /&gt;
Menu-&amp;gt;Build-&amp;gt;Configurations...-&amp;gt;Release,&lt;br /&gt;
&lt;br /&gt;
и экзешник, соответственно, брать из папки Release проекта&lt;br /&gt;
===Как в диалог добавить меню?===&lt;br /&gt;
Надо сделать в ресурсах меню, затем вставить в диалог:&lt;br /&gt;
&lt;br /&gt;
открыть в редакторе диалог, в свойствах (во вкладке General, окошко Menu) указать идентивикатор ресурса меню.&lt;br /&gt;
При помощи визарда добавить для меню обработчики OnCommand() и OnUpdateСommand().&lt;br /&gt;
===Я добавил визардом меню в диалог. Добавил обработчики для пунктов меню. Но пункты работают, но OnUpdate для пунктов не вызывается - то есть не получается ни затенить, ни чек поставить. Что делать?===&lt;br /&gt;
В диалоге у меню апдейта не происходит сам, в отличие от мейнфрейма.&lt;br /&gt;
Для этого нужно сделать самим апдейт в обработчике сообщения WM_KICKIDLE.&lt;br /&gt;
Визардом обработчик не добавляется, поэтому можно переопределить виртуальную DefWindowProc() и там обработать:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;afxpriv.h&amp;gt;	//этот файл надо включить, там определёна WM_KICKIDLE&lt;br /&gt;
&lt;br /&gt;
LRESULT CMyDialog::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam) &lt;br /&gt;
{&lt;br /&gt;
	if(message==WM_KICKIDLE)&lt;br /&gt;
	{&lt;br /&gt;
		//делаем апдейт для всех пунктов меню&lt;br /&gt;
		CMenu* pMainMenu=GetMenu();&lt;br /&gt;
		if(pMainMenu)&lt;br /&gt;
		{&lt;br /&gt;
			CCmdUI cmdUI;&lt;br /&gt;
			for (UINT n=0; n &amp;lt; pMainMenu-&amp;gt;GetMenuItemCount(); ++n)&lt;br /&gt;
			{&lt;br /&gt;
				CMenu* pSubMenu = pMainMenu-&amp;gt;GetSubMenu(n);&lt;br /&gt;
				if(!pSubMenu)continue;&lt;br /&gt;
	&lt;br /&gt;
				cmdUI.m_nIndexMax = pSubMenu-&amp;gt;GetMenuItemCount();&lt;br /&gt;
				for (UINT i = 0; i &amp;lt; cmdUI.m_nIndexMax;++i)&lt;br /&gt;
				{&lt;br /&gt;
					cmdUI.m_nIndex = i;&lt;br /&gt;
					cmdUI.m_nID = pSubMenu-&amp;gt;GetMenuItemID(i);&lt;br /&gt;
					cmdUI.m_pMenu = pSubMenu;&lt;br /&gt;
					cmdUI.DoUpdate(this, FALSE);&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	return CDialog::DefWindowProc(message, wParam, lParam);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Как на Visual C++ 6.0 в Главном окне отключить системное меню (в левом верхнем углу) и кнопки(в правом верхнем углу) ?===&lt;br /&gt;
При создании окна нужно убрать стиль WS_SYSMENU&lt;br /&gt;
(теперь пользователь корректно может закрыть окно только Alt+F4  ,&lt;br /&gt;
ну или если вы предоставите ему дополнительную возможность сделать это )&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пример 1. (для SDI, MDI)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//этот обработчик уже добавлен визардом&lt;br /&gt;
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT&amp;amp; cs)&lt;br /&gt;
{&lt;br /&gt;
	if( !CFrameWnd::PreCreateWindow(cs) )&lt;br /&gt;
		return FALSE;&lt;br /&gt;
	// TODO: Modify the Window class or styles here by modifying&lt;br /&gt;
	//  the CREATESTRUCT cs&lt;br /&gt;
&lt;br /&gt;
	///////////////////////////////&lt;br /&gt;
	//добавленная часть&lt;br /&gt;
	{&lt;br /&gt;
		//убираем стиль&lt;br /&gt;
		cs.style&amp;amp;=~WS_SYSMENU;&lt;br /&gt;
	}&lt;br /&gt;
	///////////////////////////////&lt;br /&gt;
&lt;br /&gt;
	return TRUE;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Пример 2. (для диалога)&lt;br /&gt;
Если диалог описан в ресурсах, то в свойствах диалога убрать галочки&lt;br /&gt;
  &amp;quot;System menu&amp;quot;&lt;br /&gt;
  &amp;quot;Minimize box&amp;quot;&lt;br /&gt;
  &amp;quot;Maximize box&amp;quot;&lt;br /&gt;
===Хочу сделать так, чтобы пользователь не мог нажать на кнопку, пока программа не разрешит.===&lt;br /&gt;
Нужно применить метод класса CWnd::EnableWindow(...) для кнопки.&lt;br /&gt;
Значение параметра 0 делает кнопку неактивной, 1 - делает активной.&lt;br /&gt;
(кстати, не только для кнопки можно, а для любого класса, производного&lt;br /&gt;
от класса CWnd)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пример 1. Пусть имеется некий диалог, на нём лежит кнопка c ID == IDC_1.&lt;br /&gt;
в любом месте кода диалога (кроме конструктора и деструктора , хотя, если&lt;br /&gt;
проверить наличие валидного хендла диалога, как в примере, то ничего&lt;br /&gt;
страшного не будет и там)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//делаем кнопку неактивной&lt;br /&gt;
if(m_hWnd)&lt;br /&gt;
{&lt;br /&gt;
	CWnd* pw=0;&lt;br /&gt;
	pw=GetDlgItem(IDC_1);&lt;br /&gt;
	if(pw)pw-&amp;gt;EnableWindow(0);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Что означают сообщения, которые студия выводит при компиляции, вроде таких : Loaded 'C:\WINDOWS\SYSTEM\WSOCK32.DLL', no matching symbolic information found. ===&lt;br /&gt;
Это строка говорит о том, что студия не смогла найти отладочные&lt;br /&gt;
символы для WSOCK32.DLL. В этом нет ничего страшного, просто при наличии&lt;br /&gt;
отладочных символов в процессе отладки можно получить доступ к именам&lt;br /&gt;
функции из системных DLL. Например, вместо&lt;br /&gt;
 KERNEL32! 0x77E8B184() -&lt;br /&gt;
 увидим&lt;br /&gt;
 KERNEL32!CreateThread.&lt;br /&gt;
===Как обработать сообщения , которое приходит к некому контролу (скажем CEdit) ?===&lt;br /&gt;
Нужно произвести от CEdit свой класс, и в виртуальной процедуре класса WindowProc перехватить нужные сообщения.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
virtual LRESULT WindowProc(&lt;br /&gt;
   UINT message,&lt;br /&gt;
   WPARAM wParam,&lt;br /&gt;
   LPARAM lParam &lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Пример. Полностью выключаем, скажем, обработку сообщения WM_CHAR&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	LRESULT CMyEdit::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) &lt;br /&gt;
	{&lt;br /&gt;
		switch(message)&lt;br /&gt;
		{&lt;br /&gt;
			case WM_CHAR:&lt;br /&gt;
			{&lt;br /&gt;
				return 0;&lt;br /&gt;
			}&lt;br /&gt;
			break;&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		return CEdit::WindowProc(message, wParam, lParam);&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Чтобы связать экземпляр класса с контролом на форме, добавьте визардом для&lt;br /&gt;
контрола переменную класса (выбрав не Value а Control).&lt;br /&gt;
===Как настроить количество пробелов в табуляции?===&lt;br /&gt;
Tools-&amp;gt;Options-&amp;gt;Tabs-&amp;gt;Insert Spaces&lt;br /&gt;
(или  правой кнопкой мыши по тексту-&amp;gt; properties)&lt;br /&gt;
===Как автоматически расставить отступы?===&lt;br /&gt;
Выделить текст для форматирования, нажать Alt+F8&lt;br /&gt;
&lt;br /&gt;
Есть ещё программа Artistic Style, которая занимается&lt;br /&gt;
переформатированием кода&lt;br /&gt;
http://sourceforge.net/projects/astyle/&lt;br /&gt;
===Поиск границ блока===&lt;br /&gt;
&amp;quot;CTRL+ }&amp;quot; ищет парную фигурную скобку в тексте и переходит на неё&lt;br /&gt;
===Вертикальное выделение текста===&lt;br /&gt;
&amp;quot;Alt + выделение мышкой&amp;quot; - позволяет выделять вертикальные фрагменты текста&lt;br /&gt;
===Как узнать количество установленных в CListCtrl столбцов ?===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CListCtrl* pL=...; //указатель на переменную-контрол&lt;br /&gt;
&lt;br /&gt;
int count=pL-&amp;gt;GetHeaderCtrl()-&amp;gt;GetItemCount();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как получить иконку приложения?===&lt;br /&gt;
Если приложение запущено, то нужно найти его главное окно и&lt;br /&gt;
послать ему сообщение WM_GETICON.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//функция возвращант хендл иконки &lt;br /&gt;
LRESULT SendMessage(hWnd, WM_GETICON, wParam, 0);&lt;br /&gt;
&lt;br /&gt;
//hWnd == хендл окна приложения&lt;br /&gt;
//wParam == &lt;br /&gt;
//	1)==ICON_BIG - получить большую иконку&lt;br /&gt;
//	2)==ICON_SMALL - получить маленькую иконку&lt;br /&gt;
//	3)==ICON_SMALL2 - получить маленькую иконку, если она определена&lt;br /&gt;
//				в приложении. Если её нет, то маленькую иконку, &lt;br /&gt;
//				сгенерированную системой из большой иконки&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как в CString можно найти или вырезать часть строки?===&lt;br /&gt;
есть такие методы в CString :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//вырезает кусок строки&lt;br /&gt;
CString Mid(int nFirst) const;&lt;br /&gt;
CString Mid(int nFirst,  int nCount) const;&lt;br /&gt;
&lt;br /&gt;
//возвращает кусок строки (сначала или с конца)&lt;br /&gt;
CString Left(int nCount ) const;&lt;br /&gt;
CString Right(int nCount ) const;&lt;br /&gt;
&lt;br /&gt;
//возвращает начальный кусок строки, в котором есть только&lt;br /&gt;
//символы из набора,представленного в lpszCharSet&lt;br /&gt;
CString SpanIncluding(LPCTSTR lpszCharSet ) const;&lt;br /&gt;
&lt;br /&gt;
//возвращает начальный кусок строки, в котором нет&lt;br /&gt;
//символов из набора,представленного в lpszCharSet&lt;br /&gt;
CString SpanExcluding(LPCTSTR lpszCharSet ) const; &lt;br /&gt;
&lt;br /&gt;
//убирает &amp;quot;пробелоподобные&amp;quot; символы из самого начала строки&lt;br /&gt;
//(то есть - пробел, табуляцию (\t) , возврат каретки, перевод строки (/r/n))&lt;br /&gt;
void TrimLeft();&lt;br /&gt;
//убирает все повторы символа из самого начала строки&lt;br /&gt;
void TrimLeft(TCHAR chTarget );&lt;br /&gt;
//убирает из самого начала строки все символа из набора lpszTargets &lt;br /&gt;
void TrimLeft(LPCTSTR lpszTargets ); &lt;br /&gt;
&lt;br /&gt;
void TrimRight();&lt;br /&gt;
void TrimRight(TCHAR chTarget );&lt;br /&gt;
void TrimRight(LPCTSTR lpszTargets ); &lt;br /&gt;
&lt;br /&gt;
//поиск в строке&lt;br /&gt;
int Find( TCHAR ch ) const;&lt;br /&gt;
int Find( LPCTSTR lpszSub ) const;&lt;br /&gt;
int Find( TCHAR ch, int nStart ) const;&lt;br /&gt;
int Find( LPCTSTR pstr, int nStart ) const;&lt;br /&gt;
&lt;br /&gt;
//поиск, начиная с конца&lt;br /&gt;
int ReverseFind( TCHAR ch ) const;&lt;br /&gt;
&lt;br /&gt;
//поиск позиции первого символа, одного из набора,&lt;br /&gt;
// представленного в lpszCharSet&lt;br /&gt;
int FindOneOf( LPCTSTR lpszCharSet ) const;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Есть у меня CListBox и я в ходе выполнения программы добавляю в него строки. Но я не могу посмотреть что именно добавляется. Вывод результатов происходит в конце выполнения процедуры...===&lt;br /&gt;
Если нужно делать принудительную перерисовку окна во время&lt;br /&gt;
длительных вычислений, то нужно вызывать для окна, которое&lt;br /&gt;
надо перерисовать метод&lt;br /&gt;
  RedrawWindow()&lt;br /&gt;
с параметрами по умолчанию, или пару&lt;br /&gt;
  Invalidate(0);&lt;br /&gt;
  UpdateWindow();&lt;br /&gt;
Это приводит к пометке всего окна к перерисовке и отправлению&lt;br /&gt;
сообщения WM_PAINT в оконную процедуру в обход очереди&lt;br /&gt;
сообщений, вызывая немедленную перерисовку окна.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CWnd* pw=...;//окно , которое надо перерисовывать&lt;br /&gt;
&lt;br /&gt;
for(int i=0;i&amp;lt;10000)&lt;br /&gt;
{&lt;br /&gt;
	//меняется содержимое окна&lt;br /&gt;
	//...&lt;br /&gt;
&lt;br /&gt;
	//немедленная перерисовка&lt;br /&gt;
	pw-&amp;gt;Invalidate(0);&lt;br /&gt;
	pw-&amp;gt;UpdateWindow();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Я написал DLL , которую используют несколько приложений. Всё вроде работает, но когда происходит очередной вызов функции из DLL , почему то данные в функции обнуляются. С чем это связано ?===&lt;br /&gt;
Переменные и массивы в DLL, содержимое которых должно использоваться несколькими процессами, должны объявляться статическими. Статическая переменная или массив инициализируются только один раз в момент загрузки DLL.&lt;br /&gt;
Пример:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DWORD calltest()&lt;br /&gt;
{&lt;br /&gt;
	//будет выполнено только при первом вызове&lt;br /&gt;
	static DWORD callcount=0;&lt;br /&gt;
	static DWORD str[1000]={0}; &lt;br /&gt;
&lt;br /&gt;
	//будет выполняться каждый раз&lt;br /&gt;
	return ++callcount;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как открыть проекцию файла в память и как с ней работать?===&lt;br /&gt;
Как открыть проекцию файла в память и как с ней работать?&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HANDLE CreateFileMapping(&lt;br /&gt;
  HANDLE hFile,	//хендл уже открытого файла&lt;br /&gt;
  LPSECURITY_ATTRIBUTES lpAttributes,&lt;br /&gt;
  DWORD flProtect,	//способ открытия проекции&lt;br /&gt;
  DWORD dwMaximumSizeHigh,	//размер файла (старшие 4 байта , обычно==0)&lt;br /&gt;
  DWORD dwMaximumSizeLow,	//размер файла (младшие 4 байта)&lt;br /&gt;
  LPCTSTR lpName&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Доступ к созданной проекции производится процедурой&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LPVOID MapViewOfFile(&lt;br /&gt;
  HANDLE hFileMappingObject, //хендл проекции&lt;br /&gt;
  DWORD dwDesiredAccess,	//способ работы с проекцией&lt;br /&gt;
  DWORD dwFileOffsetHigh,&lt;br /&gt;
  DWORD dwFileOffsetLow, //смещение от начала файла (младшие 4 байта)&lt;br /&gt;
  SIZE_T dwNumberOfBytesToMap //длина в байтах (если ==0 - то весь файл)&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
далее с файлом можно работать как с обычным массивом в памяти.&lt;br /&gt;
&lt;br /&gt;
После работы с проекцией , её надо освободить процедурой&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
BOOL UnmapViewOfFile(&lt;br /&gt;
  LPCVOID lpBaseAddress //адрес, который вернула процедура MapViewOfFile&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Пример.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HANDLE hMapFile=0;//для проекции&lt;br /&gt;
&lt;br /&gt;
HANDLE hFile=...;//хендл уже открытого файла&lt;br /&gt;
DWORD dwdFileLen=...;//размер открытого файла&lt;br /&gt;
&lt;br /&gt;
//создаём проекцию &amp;quot;только для чтения&amp;quot;&lt;br /&gt;
hMapFile=::CreateFileMapping(hFile,0,PAGE_READONLY,0,dwdFileLen,0);&lt;br /&gt;
&lt;br /&gt;
//хендл hFile можно закрыть уже здесь, в принципе,&lt;br /&gt;
//но мы сделаем это позже&lt;br /&gt;
&lt;br /&gt;
//получаем доступ к проекции (тоже только для чтения)&lt;br /&gt;
BYTE* pbyFile=(BYTE*)::MapViewOfFile(hMapFile,FILE_MAP_READ,0,0,0);&lt;br /&gt;
&lt;br /&gt;
///////////////////&lt;br /&gt;
//тут работаем с массивом pbyFile[dwdFileLen] как с обычным,&lt;br /&gt;
//только не забываем, что он открыт только для чтения&lt;br /&gt;
//...&lt;br /&gt;
//...&lt;br /&gt;
//...&lt;br /&gt;
///////////////////&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//отключаем файл данных от адресного пространства&lt;br /&gt;
UnmapViewOfFile(pbyFile);&lt;br /&gt;
&lt;br /&gt;
//освобождаем хендл проекции&lt;br /&gt;
CloseHandle(hMapFile)&lt;br /&gt;
&lt;br /&gt;
//освобождаем хендл открытого файла&lt;br /&gt;
CloseHandle(hFile);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Использую MFC Grid control 2.25 , не получается отобразить картинку в ячейке. Как это делается ?===&lt;br /&gt;
Нужно создать список изображений (CImageList) , затем передать указатель на список в контрол. Поскольку контрол лишь копирует указатель , список должен создаваться динамически, либо быть членом класса, экземпляр которого существует всё время работы контрола.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 m_GridMarket&lt;br /&gt;
CImageList m_ImageList;&lt;br /&gt;
CGridCtrL m_Grid1&lt;br /&gt;
...&lt;br /&gt;
...&lt;br /&gt;
//неким образом создаётся список&lt;br /&gt;
m_ImageList.Create(...);&lt;br /&gt;
//...&lt;br /&gt;
&lt;br /&gt;
//вставляем в контрол&lt;br /&gt;
m_Grid1.SetImageList(&amp;amp;m_ImageList);&lt;br /&gt;
&lt;br /&gt;
//&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как при помощи IPicture отобразить картинку из файла? ===&lt;br /&gt;
Пример - несложная функция, отображающая картинку из файла&lt;br /&gt;
&lt;br /&gt;
поддерживаются форматы&lt;br /&gt;
BMP, GIF, JPEG, PNG, TIFF, EMF&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;quot;atlconv.h&amp;quot;&lt;br /&gt;
#define HandleIsValid(H) (H!=(HANDLE)-1 &amp;amp;&amp;amp; H!=(HANDLE)0)&lt;br /&gt;
&lt;br /&gt;
//*pDestDC - CDC, на который предполагается вывод картинки&lt;br /&gt;
//pchzFilePath - путь к файлу&lt;br /&gt;
//pWid - (возвращает) ширина картинки&lt;br /&gt;
//pHig - (возвращает) высота картинки&lt;br /&gt;
bool DrawBitmapFromFile(CDC* pDestDC,const char* pchzFilePath,int *pWid=0,int *pHig=0)&lt;br /&gt;
{&lt;br /&gt;
	bool result=false;&lt;br /&gt;
&lt;br /&gt;
	if(pWid)*pWid=0;&lt;br /&gt;
	if(pHig)*pHig=0;&lt;br /&gt;
&lt;br /&gt;
	int Wid=0;&lt;br /&gt;
	int Hig=0;&lt;br /&gt;
&lt;br /&gt;
	IPicture* pPic=0;&lt;br /&gt;
	try&lt;br /&gt;
	{&lt;br /&gt;
		IPicture* ptmpPic=0;&lt;br /&gt;
		USES_CONVERSION;&lt;br /&gt;
		HRESULT hr;&lt;br /&gt;
&lt;br /&gt;
		CString txt=pchzFilePath;&lt;br /&gt;
		hr= ::OleLoadPicturePath(&lt;br /&gt;
			const_cast&amp;lt;LPOLESTR&amp;gt;(T2COLE(txt)),&lt;br /&gt;
			0,0,0,IID_IPicture,&lt;br /&gt;
			reinterpret_cast&amp;lt;void **&amp;gt;(&amp;amp;ptmpPic)&lt;br /&gt;
			);&lt;br /&gt;
&lt;br /&gt;
		if(hr==S_OK &amp;amp;&amp;amp; ptmpPic)&lt;br /&gt;
		{&lt;br /&gt;
			pPic=ptmpPic;&lt;br /&gt;
		}&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			throw 0;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		OLE_XPOS_HIMETRIC cxSrc;&lt;br /&gt;
		OLE_YPOS_HIMETRIC cySrc;&lt;br /&gt;
&lt;br /&gt;
		if(S_OK!=pPic-&amp;gt;get_Width(&amp;amp;cxSrc))throw 0;&lt;br /&gt;
		if(S_OK!=pPic-&amp;gt;get_Height(&amp;amp;cySrc))throw 0;&lt;br /&gt;
&lt;br /&gt;
		Wid=cxSrc/26;&lt;br /&gt;
		Hig=cySrc/26;&lt;br /&gt;
&lt;br /&gt;
		//рисуем&lt;br /&gt;
		if(S_OK !=pPic-&amp;gt;Render(pDestDC-&amp;gt;GetSafeHdc(),&lt;br /&gt;
			0,Hig,Wid,-Hig,0,0,cxSrc,cySrc,0))throw 0;&lt;br /&gt;
	}&lt;br /&gt;
	catch(...)&lt;br /&gt;
	{&lt;br /&gt;
		result=false;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if(pPic)&lt;br /&gt;
	{&lt;br /&gt;
		pPic-&amp;gt;Release();&lt;br /&gt;
		pPic=0;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	if(pWid)*pWid=Wid;&lt;br /&gt;
	if(pHig)*pHig=Hig;&lt;br /&gt;
&lt;br /&gt;
	return result;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===У меня модальное диалоговое окно, в нем поле редактирования мультилайновое, т.е. чтобы перейти на новую строку надо нажать ентер, но вызывается стандартный обработчик диалогового окна. Подскажите, что делать?===&lt;br /&gt;
Нужно в редакторе ресурсов поставить для CEdit окошка галочку&lt;br /&gt;
свойства WantReturn,&lt;br /&gt;
&lt;br /&gt;
или добавить ES_WANTRETURN при создании CEdit контрола динамически.&lt;br /&gt;
===Как выводят картинку-логотип(splash screen) при запуске программы? То есть, когда загружается программа на экран выводится картинка, потом она исчезает(загрузка программы закончена) и пользователь может приступать к работе ===&lt;br /&gt;
Для этого используется класс, производный от CDialog. Этот диалог после создания показывает себя на экран, выводя на себя рисунок. Также запускает таймет, по срабатывани которого диалог гасится. Создаётся диалог InitInstance приложения.&lt;br /&gt;
&lt;br /&gt;
В VC6++ также есть уже готовый компонент&lt;br /&gt;
Project-&amp;gt;Add To Project -&amp;gt; Components and Controls-&amp;gt;(в папке &amp;quot;Visual C++ Components&amp;quot; есть SplashScreen.)&lt;br /&gt;
===Как сделать, чтобы при выпадении списка у ComboBox была не одна строка, а больше, вроде все свойства покрутил, не помогает Вместо выпадающего списка одна строка и скролл...===&lt;br /&gt;
В редакторе ресурсов надо щелкнуть в комбобоксе на треугольнике - появляется рамка для растягивания вниз - размер выпадающего списка.&lt;br /&gt;
===В VC++.net , что делать после того, как на форму установил ActiiveX ListView, как объявить класс и переменную для этого элемента?===&lt;br /&gt;
Щёлкнуть правой кнопкой мыши на элементе , в меню - add variable или add class&lt;br /&gt;
===Как вставить данные в буфер обмена (Clipboard) ? Как их оттуда вытащить ?===&lt;br /&gt;
&lt;br /&gt;
1) копирование в буфер обмена:&lt;br /&gt;
&lt;br /&gt;
  1.Готовим данные&lt;br /&gt;
    а.Выделяем память из кучи,  вызывая GlobalAlloc()&lt;br /&gt;
    б.Получаем указатель на выделенную память, вызывая GlobalLock()&lt;br /&gt;
    в.Заполняем данные&lt;br /&gt;
    г.Освобождаем указатель , вызывая GlobalUnlock();&lt;br /&gt;
&lt;br /&gt;
  2.Открываем буфер обмена , вызывая OpenClipboard();&lt;br /&gt;
  3.Очищаем буфер, вызывая EmptyClipboard();&lt;br /&gt;
  4.Вызываем SetClipboardData() один раз для каждого формата&lt;br /&gt;
      вставляемых данных (имеется в виду - если одни и те же&lt;br /&gt;
      данные представлены в разных форматах, и приложение&lt;br /&gt;
      может эти форматы создать)&lt;br /&gt;
  5.Закрываем буфер, вызывая CloseClipboard();&lt;br /&gt;
  6.ВЫЗЫВАТЬ GlobalFree() НЕ НУЖНО , в этом случае это&lt;br /&gt;
      предоставлено системе&lt;br /&gt;
&lt;br /&gt;
Скажем, хотим поместить в буфер обмена туда текст.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	//готовим данные&lt;br /&gt;
	//выделяем из кучи память для данных&lt;br /&gt;
	HANDLE hglbCopy = GlobalAlloc(GMEM_MOVEABLE,10);&lt;br /&gt;
	if(!hglbCopy)return;&lt;br /&gt;
&lt;br /&gt;
	//получаем указатель&lt;br /&gt;
	void* lpStr = GlobalLock(hglbCopy);&lt;br /&gt;
	if(!lpStr)return;&lt;br /&gt;
&lt;br /&gt;
	//заполняем данные&lt;br /&gt;
	strcpy((char*)lpStr,&amp;quot;my text&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	//освобождаем указатель&lt;br /&gt;
	GlobalUnlock(hglbCopy);&lt;br /&gt;
	lpStr=0;&lt;br /&gt;
&lt;br /&gt;
	//открываем буфер обмена&lt;br /&gt;
	OpenClipboard();&lt;br /&gt;
	//очищаем&lt;br /&gt;
	EmptyClipboard();&lt;br /&gt;
&lt;br /&gt;
	//текстовый формат&lt;br /&gt;
	SetClipboardData(CF_TEXT,hglbCopy);&lt;br /&gt;
&lt;br /&gt;
	//закрываем буфер&lt;br /&gt;
	CloseClipboard();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
2) извлечение из буфера обмена&lt;br /&gt;
&lt;br /&gt;
  1.Проверяем, что поддерживается нужный формат данных,&lt;br /&gt;
      вызывая IsClipboardFormatAvailable()&lt;br /&gt;
  2.Открываем буфер обмена , вызывая OpenClipboard();&lt;br /&gt;
  3.Достаём данные&lt;br /&gt;
   а.Получаем из буфера хендл требуемого формата,&lt;br /&gt;
      вызывая GetClipboardData()&lt;br /&gt;
    б.Получаем указатель на выделенную память, вызывая GlobalLock()&lt;br /&gt;
    в.Работаем с данными&lt;br /&gt;
    г.Освобождаем указатель , вызывая GlobalUnlock();&lt;br /&gt;
  4.Закрываем буфер, вызывая CloseClipboard();&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	//Проверяем, что поддерживается нужный формат данных,&lt;br /&gt;
	if(!IsClipboardFormatAvailable(CF_TEXT))return;&lt;br /&gt;
&lt;br /&gt;
	//открываем буфер обмена&lt;br /&gt;
	OpenClipboard();&lt;br /&gt;
&lt;br /&gt;
	//достаём данные&lt;br /&gt;
&lt;br /&gt;
	//текстовый формат&lt;br /&gt;
	HANDLE hglbCopy = GetClipboardData(CF_TEXT);&lt;br /&gt;
	if(!hglbCopy)return;&lt;br /&gt;
&lt;br /&gt;
	//получаем указатель&lt;br /&gt;
	void* lpStr = GlobalLock(hglbCopy);&lt;br /&gt;
	if(!lpStr)return;&lt;br /&gt;
&lt;br /&gt;
	//читаем данные&lt;br /&gt;
	char data[10];&lt;br /&gt;
	memmove(data,lpStr,sizeof(data));&lt;br /&gt;
&lt;br /&gt;
	//освобождаем указатель&lt;br /&gt;
	GlobalUnlock(hglbCopy);&lt;br /&gt;
	lpStr=0;&lt;br /&gt;
&lt;br /&gt;
	//закрываем буфер&lt;br /&gt;
	CloseClipboard();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как получить полный путь к экзешнику из самой программы ?===&lt;br /&gt;
В командную строку первым параметром система всегда передаёт заключённый в кавычки полный путь к файлу запущенной программы Достаём путь таким образом :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
BOOL CMyApp::InitInstance()&lt;br /&gt;
{&lt;br /&gt;
	//добыча полного имени экзешника&lt;br /&gt;
	CString csFullExeName;&lt;br /&gt;
	{&lt;br /&gt;
		CString csAppName=GetCommandLine();&lt;br /&gt;
		csAppName.Delete(0,1);&lt;br /&gt;
		csAppName.Replace('\&amp;quot;','\0');&lt;br /&gt;
		csFullExeName=(const char*)csAppName;&lt;br /&gt;
	}&lt;br /&gt;
	//теперь csFullExeName - содержит искомый путь&lt;br /&gt;
&lt;br /&gt;
	//...&lt;br /&gt;
	//...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Каким способом можно exe файл может заменить самого себя? То есть, моя программа обновляется, например, через Internet, и хочет обновить свой exe-файл. Но так как он в данный момент запущен - это будет, естественно, запрещено. Как это можно проще всего сделать?===&lt;br /&gt;
Один из способов - сделать копию экзешника и из него обновиться&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define def_exeNAMEup	&amp;quot;c:\\myprog_update.exe&amp;quot;&lt;br /&gt;
#define def_exeNAMEdnld	&amp;quot;c:\\myprog_downloaded.exe&amp;quot;&lt;br /&gt;
#define def_keyUdate	&amp;quot;/update&amp;quot;&lt;br /&gt;
&lt;br /&gt;
void CTESTFAQApp::UpdateItself()&lt;br /&gt;
{&lt;br /&gt;
	//добыча полного имени экзешника&lt;br /&gt;
	CString csFullExeName;&lt;br /&gt;
	{&lt;br /&gt;
		CString csAppName=GetCommandLine();&lt;br /&gt;
		csAppName.Delete(0,1);&lt;br /&gt;
		csAppName.Replace('\&amp;quot;','\0');&lt;br /&gt;
		csFullExeName=(const char*)csAppName;&lt;br /&gt;
	}&lt;br /&gt;
	//теперь csFullExeName - содержит искомый путь&lt;br /&gt;
&lt;br /&gt;
	//делаем копию экзешника с другим именем&lt;br /&gt;
	CopyFile(csFullExeName,def_exeNAMEup,0);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	//передаём в параметры нового процесса ключ и путь к текущему файлу&lt;br /&gt;
	CString csParams=def_keyUdate;&lt;br /&gt;
	csParams+=&amp;quot; &amp;quot;;&lt;br /&gt;
	csParams+=csFullExeName;&lt;br /&gt;
&lt;br /&gt;
	//запускаем копию&lt;br /&gt;
	STARTUPINFO si;&lt;br /&gt;
	PROCESS_INFORMATION pi;&lt;br /&gt;
	ZeroMemory(&amp;amp;si,sizeof(si));&lt;br /&gt;
	si.cb = sizeof(si);&lt;br /&gt;
	ZeroMemory(&amp;amp;pi,sizeof(pi));&lt;br /&gt;
	if(CreateProcess(def_exeNAMEup,def_keyUdate,0,0,0,0,0,0,&amp;amp;si,&amp;amp;pi))&lt;br /&gt;
	{&lt;br /&gt;
		//завершаем текущий процесс&lt;br /&gt;
		ExitFromMyApp();&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void CTESTFAQApp::ExitFromMyApp()&lt;br /&gt;
{&lt;br /&gt;
	exit(0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
BOOL CTESTFAQApp::InitInstance()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
	//смотрим, не запустили ли для апдейта?&lt;br /&gt;
&lt;br /&gt;
	CString txt;&lt;br /&gt;
	txt=m_lpCmdLine;&lt;br /&gt;
	if(txt.Find(def_keyUdate)==0)&lt;br /&gt;
	{&lt;br /&gt;
		//делаем айдейт&lt;br /&gt;
		txt.Replace(def_keyUdate,&amp;quot;&amp;quot;);&lt;br /&gt;
		txt.TrimLeft();&lt;br /&gt;
&lt;br /&gt;
		CString csFullExeName=txt;&lt;br /&gt;
&lt;br /&gt;
		//берём откуда то уже скачанный файл обновления&lt;br /&gt;
		//...&lt;br /&gt;
		CString csFull_Downloaded_ExeName=def_exeNAMEdnld;&lt;br /&gt;
&lt;br /&gt;
		//копируем файл (обновляем старый то есть)&lt;br /&gt;
		CopyFile(csFull_Downloaded_ExeName,csFullExeName,0);&lt;br /&gt;
&lt;br /&gt;
		//запускаем обновлённого мученника&lt;br /&gt;
		STARTUPINFO si;&lt;br /&gt;
		PROCESS_INFORMATION pi;&lt;br /&gt;
		ZeroMemory(&amp;amp;si,sizeof(si));&lt;br /&gt;
		si.cb = sizeof(si);&lt;br /&gt;
		ZeroMemory(&amp;amp;pi,sizeof(pi));&lt;br /&gt;
		if(CreateProcess(csFullExeName,0,0,0,0,0,0,0,&amp;amp;si,&amp;amp;pi))&lt;br /&gt;
&lt;br /&gt;
		ExitFromMyApp();&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
	//...&lt;br /&gt;
	//...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Есть строка символов (страничка из Инета) в кодировке utf-8 (строка char*). Как мне ее получить в формате String&lt;br /&gt;
или в char* в кодировке ANSI (cp 1251) ?===&lt;br /&gt;
Можно перевести строку из UTF8 в Unicode, затем из Unicode в 1251&lt;br /&gt;
&lt;br /&gt;
Ниже приведена структура, содержащая процедуры перекодирования,&lt;br /&gt;
а также процедуру с примером использования&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//описание структуры&lt;br /&gt;
struct coder&lt;br /&gt;
{&lt;br /&gt;
	//utf8-&amp;gt;unicode&lt;br /&gt;
	static wchar_t* utf8_to_unicode__dontForgetDeleteArr(const char *utf8_string)&lt;br /&gt;
	{&lt;br /&gt;
		wchar_t* pRes=0;&lt;br /&gt;
		int res_len=0;&lt;br /&gt;
&lt;br /&gt;
		//тест на возможность преобразования&lt;br /&gt;
		res_len=MultiByteToWideChar(CP_UTF8,0,utf8_string,-1,0,0);&lt;br /&gt;
		if(!res_len)return 0;&lt;br /&gt;
&lt;br /&gt;
		//выделяем память&lt;br /&gt;
		pRes = new wchar_t[res_len];&lt;br /&gt;
		if(!pRes)return 0;&lt;br /&gt;
&lt;br /&gt;
		//преобразование&lt;br /&gt;
		if(!MultiByteToWideChar(CP_UTF8,0,utf8_string,-1,pRes,res_len))&lt;br /&gt;
		{&lt;br /&gt;
			delete [] pRes;&lt;br /&gt;
			return 0;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		return pRes;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	//unicode-&amp;gt;1251&lt;br /&gt;
	static char * unicode_to_1251__dontForgetDeleteArr(const wchar_t *unicode_string)&lt;br /&gt;
	{&lt;br /&gt;
		char* pRes=0;&lt;br /&gt;
		int res_len=0;&lt;br /&gt;
&lt;br /&gt;
		//тест на возможность преобразования&lt;br /&gt;
		res_len = WideCharToMultiByte(1251,0,unicode_string,-1,0,0,0,0);&lt;br /&gt;
		if(!res_len)return 0;&lt;br /&gt;
&lt;br /&gt;
		//выделяем память&lt;br /&gt;
		pRes=new char[res_len];&lt;br /&gt;
		if(!pRes)return 0;&lt;br /&gt;
&lt;br /&gt;
		//преобразование&lt;br /&gt;
		if(!WideCharToMultiByte(1251,0,unicode_string,-1,pRes,res_len,0,0))&lt;br /&gt;
		{&lt;br /&gt;
			delete [] pRes;&lt;br /&gt;
			return 0;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		return pRes;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	//процедура с примером&lt;br /&gt;
	static void Example()&lt;br /&gt;
	{&lt;br /&gt;
		wchar_t* unicode_string=0;&lt;br /&gt;
		char* cp1251_string=0;&lt;br /&gt;
&lt;br /&gt;
		//исходный текст&lt;br /&gt;
		char utf8_string[] = &amp;quot;UTF-8 + СЂСѓСЃСЃРєРёР№ С‚РµРєСЃС‚&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
		for(;;)&lt;br /&gt;
		{&lt;br /&gt;
&lt;br /&gt;
			unicode_string=utf8_to_unicode__dontForgetDeleteArr(utf8_string);&lt;br /&gt;
			if(!unicode_string)&lt;br /&gt;
			{&lt;br /&gt;
				AfxMessageBox(&amp;quot;Не удалось конвертировать в unicode!&amp;quot;);&lt;br /&gt;
				break;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			cp1251_string = unicode_to_1251__dontForgetDeleteArr(unicode_string);&lt;br /&gt;
&lt;br /&gt;
			if(!cp1251_string)&lt;br /&gt;
			{&lt;br /&gt;
				AfxMessageBox(&amp;quot;Не удалось конвертировать из unicode!&amp;quot;);&lt;br /&gt;
				break;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			break;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		//cp1251_string - результат&lt;br /&gt;
		AfxMessageBox(cp1251_string);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
		//не забываем удалить массивы&lt;br /&gt;
		if(unicode_string)&lt;br /&gt;
		{&lt;br /&gt;
			delete [] unicode_string;&lt;br /&gt;
			unicode_string=0;&lt;br /&gt;
		}&lt;br /&gt;
		if(cp1251_string)&lt;br /&gt;
		{&lt;br /&gt;
			delete [] cp1251_string;&lt;br /&gt;
			cp1251_string=0;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
//вызов примера&lt;br /&gt;
coder::Example();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как организовать взаимодействие программы на VC.net с Access-овской базой данных?===&lt;br /&gt;
Проще всего подключить ADO компоненты и сделать все на них.&lt;br /&gt;
Компоненты  ADO (ADODC,DATAGRID и т.п.) это ActiveX.&lt;br /&gt;
В редакторе ресурсов, во всплывающем меню, есть Insert ActiveX Control -&amp;gt; открывается список всех компоент,&lt;br /&gt;
зарегистрированых на машине. Нужно найти компоненты (Это компоненты от MS и они помечены (OLEDB)) и вставить их в диалог. Для того что бы иметь возможность управлять ими, нужно импортировать обертки для них, это делается при помощи ClassWisard, там есть импорт-&amp;gt;класс-&amp;gt;указать файл с компоентой (OSX).&lt;br /&gt;
Появляется список всех классов, объявленых внутри.&lt;br /&gt;
Проставляем галочки, нажимаем ОК.&lt;br /&gt;
&lt;br /&gt;
[[Category:FAQ]]&lt;/div&gt;</summary>
		<author><name>Mczim</name></author>	</entry>

	<entry>
		<id>https://wiki.shelek.ru/index.php?title=FAQ:WinAPI,_VCPP_Part_3&amp;diff=406</id>
		<title>FAQ:WinAPI, VCPP Part 3</title>
		<link rel="alternate" type="text/html" href="https://wiki.shelek.ru/index.php?title=FAQ:WinAPI,_VCPP_Part_3&amp;diff=406"/>
				<updated>2008-08-14T18:36:11Z</updated>
		
		<summary type="html">&lt;p&gt;Mczim: на него ругается. ума не приложу, &amp;gt; на него ругается. Ума не приложу, + Commands. , В окошке &amp;gt; Commands. В окошке&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Имеется приложение на основе CRichEditView. Как узнать, что пользователь меняет текст?===&lt;br /&gt;
Добавить обработчик сообщения EN_CHANGE. Сообщение генерируется CRichEditView каждый раз, когда пользователь изменяет текст в окне CRichEditView&lt;br /&gt;
===Чем метод CArray::GetSize отличается от метода CArray::GetCount?===&lt;br /&gt;
Абсолютно ничем. (Скорее всего, были предыдущие библиотеки, в которых функции, одинаковые по смыслу, имели разные имена. Поэтому в целях совместимости оставили оба)&lt;br /&gt;
===Как загрузить строку из ресурса?===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CString m_Temp;&lt;br /&gt;
m_Temp.LoadString(ID_MYSTRING);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как поменять иконку у элемента (item) в CListCtrl?===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//заполняем структуру LVITEM&lt;br /&gt;
LVITEM lvItem;&lt;br /&gt;
memset(&amp;amp;lvItem,0,sizeof(lvItem));&lt;br /&gt;
	&lt;br /&gt;
lvItem.mask = LVIF_IMAGE;//меняться будет картинка&lt;br /&gt;
lvItem.iItem = ...;// индекс элемента списка (Zero-based)&lt;br /&gt;
lvItem.iSubItem = 0;&lt;br /&gt;
lvItem.iImage = ...; //индекс иконки (из списка контрола)&lt;br /&gt;
	&lt;br /&gt;
pList-&amp;gt;SetItem(&amp;amp; lvItem);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Имеется класс Class1, содержащий мембер типа указатель на Class2. В Class2 также имеется указатель на Class1. Компилятор выдаёт ошибку. Что надо делать?===&lt;br /&gt;
Предварительно объявляем класс Class2. Тогда компилятору будет известно, что описание класса Class2 будет встречено дальше, и станет возможным объявление указателей на класс до описания самого класса.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Class2;//предопределение&lt;br /&gt;
	&lt;br /&gt;
Class1&lt;br /&gt;
{&lt;br /&gt;
	Class2* p;&lt;br /&gt;
};&lt;br /&gt;
	&lt;br /&gt;
Class2&lt;br /&gt;
{&lt;br /&gt;
	Class1* p;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как переключить раскладку в другом (то есть в активном) процессе?===&lt;br /&gt;
Использовать функции:&lt;br /&gt;
   GetKeyboardLayout - определить текущую раскладку&lt;br /&gt;
   LoadKeyboardLayout - загрузить новую раскладку&lt;br /&gt;
&lt;br /&gt;
см.также&lt;br /&gt;
   VerLanguageName - получить строку с описанием языка&lt;br /&gt;
&lt;br /&gt;
(подробности - в MSDN)&lt;br /&gt;
===Как получить хендл контрола Edit зная его ID?===&lt;br /&gt;
Пусть контрол лежит на окне CMyWnd&lt;br /&gt;
Тогда:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void CMyWnd::некая_процедура()&lt;br /&gt;
{&lt;br /&gt;
	//для MFC&lt;br /&gt;
	CEdit* ed=(CEdit* ) GetDlgItem(ID_EDIT1);&lt;br /&gt;
	HWND hwnd=ed-&amp;gt;GetSafeHwnd();&lt;br /&gt;
	...&lt;br /&gt;
	&lt;br /&gt;
	//для Win32 API&lt;br /&gt;
	HWND hwnd=GetDlgItem(m_hWnd,ID_EDIT1);&lt;br /&gt;
	...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Как из дочернего окна закрыть приложение?===&lt;br /&gt;
Нужно послать родительскому окну (*pParent) сообщение WM_CLOSE:&lt;br /&gt;
 pParent-&amp;gt;PostMessage(WM_CLOSE);//MFC&lt;br /&gt;
или&lt;br /&gt;
 ::PostMessage(pParent-&amp;gt;m_hWnd,WM_CLOSE,(WPARAM)0,(LPARAM)0);//API&lt;br /&gt;
===Как корректно перевести BSTR в CString и наоборот?===&lt;br /&gt;
Нужно просто присвоить переменной типа CString переменную типа BSTR.&lt;br /&gt;
Оператор = класса CString сам всё переведёт.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//указатель на будущий буфер с BSTR.&lt;br /&gt;
//	(По сути, BSTR определён как &lt;br /&gt;
//	typedef WCHAR* BSTR;&lt;br /&gt;
//	то есть указатель на 16-битный символ юникод)&lt;br /&gt;
	&lt;br /&gt;
BSTR bstrHE=0;&lt;br /&gt;
	&lt;br /&gt;
CString Str=&amp;quot;мой текст&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
//Выделить память и загрузить адрес блока в bstrHE&lt;br /&gt;
bstrHE=Str.AllocSysString();&lt;br /&gt;
	&lt;br /&gt;
//...	&lt;br /&gt;
//тут работаем с bstrHE[]&lt;br /&gt;
//...&lt;br /&gt;
	&lt;br /&gt;
//освобождаем память&lt;br /&gt;
SysFreeString(bstrHE);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Как получить доступ к графическим ресурсам элементов текущей темы оформления Windows?===&lt;br /&gt;
Использовать функции&lt;br /&gt;
&lt;br /&gt;
OpenThemeData()&lt;br /&gt;
DrawThemeBackground()&lt;br /&gt;
DrawFrameControl()&lt;br /&gt;
CloseThemeData().&lt;br /&gt;
&lt;br /&gt;
(подробности - в MSDN)&lt;br /&gt;
===Имеется класс , производный от CDialog. Когда диалог в фокусе, нажатие на Enter или Esc приводит к закрытию диалога. Как это запретить?===&lt;br /&gt;
При нажатии Enter происходит выполнение команды IDOK,&lt;br /&gt;
при нажатии Esc - IDCANCEL.&lt;br /&gt;
Нужно переопределить в классе виртуальные функции OnOk() и OnCancel(),&lt;br /&gt;
которые соответственно вызываются для этих команд. При помощи&lt;br /&gt;
визарда эти функции добавить можно так: Положить на диалог две кнопки&lt;br /&gt;
с идентификаторами IDOK и IDCANCEL (при создании нового диалога они там&lt;br /&gt;
есть сразу), затем двойной клик по кнопке добавляет соответствующий&lt;br /&gt;
обработчик. В обработчиках надо удалить вызовы СDialog::OnOK() и&lt;br /&gt;
CDialog::OnCancel(), тогда диалог закрываться не будет.&lt;br /&gt;
Однако тогда диалог станет невозможно закрыть кнопкой с крестиком  :)&lt;br /&gt;
&lt;br /&gt;
Лечить так: добавить обработчик сообщения WM_CLOSE - OnClose(), и в нём&lt;br /&gt;
сделать вызов OnOk() или OnCancel() :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void CPlayersPropsDialog::OnClose() &lt;br /&gt;
{&lt;br /&gt;
	CDialog::OnClose();&lt;br /&gt;
	CDialog::OnCancel();//добавлено&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===VC++6. Я написал простейший макрос, а компилятор на него ругается. Ума не приложу, что за глюк?===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	#define my_macr(x,y,z) \&lt;br /&gt;
		z=\&lt;br /&gt;
		(x+y)*\&lt;br /&gt;
		(x-y)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Скорее всего после одного из символов соединения строк &amp;quot;\&amp;quot; имеется&lt;br /&gt;
пробел или табуляция. Их надо удалить. Можно найти их &amp;quot;наощупь&amp;quot;, а&lt;br /&gt;
можно включить показ непечатных символов в студии. Найти эту команду&lt;br /&gt;
можно так:&lt;br /&gt;
Tools-&amp;gt;Customize...-&amp;gt;вкладка Commands. В окошке Category выбрать&lt;br /&gt;
&amp;quot;Edit&amp;quot;, и среди кнопок справа найти кнопку, на которой написано &amp;quot;a.b&amp;quot;&lt;br /&gt;
Эту кнопку надо перетащить на одну из панелей инструментов студии.&lt;br /&gt;
&lt;br /&gt;
===Как получить список всех процесов, включая idle ?===&lt;br /&gt;
Использовать функции&lt;br /&gt;
Process32First()&lt;br /&gt;
Precess32Next()&lt;br /&gt;
===Как программно установить переменные окружения?===&lt;br /&gt;
Чтобы добавить или изменить их программно, необходимо воспользоваться&lt;br /&gt;
ключом реестра HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\&lt;br /&gt;
Session Manager\Environment, а затем отправить широковещательное&lt;br /&gt;
сообщение WM_SETTINGCHANGE. Это позволит приложениям узнать об&lt;br /&gt;
изменениях:&lt;br /&gt;
&lt;br /&gt;
::SendMessage(HWND_BROADCAST,WM_SETTINGCHANGE,0,0);&lt;br /&gt;
===Как сделать,чтобы у окна был черный фон?===&lt;br /&gt;
переопределить обработчик сообщения WM_CTLCOLOR - OnCtlColor() :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CBrush br(RGB(0,0,0));&lt;br /&gt;
	&lt;br /&gt;
HBRUSH CMyDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) &lt;br /&gt;
{&lt;br /&gt;
	HBRUSH hbr = CMyDlg::OnCtlColor(pDC, pWnd, nCtlColor);&lt;br /&gt;
	&lt;br /&gt;
	//фон диалога (или вьюшки)&lt;br /&gt;
	if(nCtlColor==CTLCOLOR_DLG)&lt;br /&gt;
	{&lt;br /&gt;
		return (HBRUSH)br;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	//фон статиков (если нужно)&lt;br /&gt;
	if(nCtlColor==CTLCOLOR_STATIC)&lt;br /&gt;
	{&lt;br /&gt;
		//делаем фон текста статика прозрачным&lt;br /&gt;
		pDC-&amp;gt;SetBkMode(TRANSPARENT);&lt;br /&gt;
		return (HBRUSH)br;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	return hbr;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Почему на моем компьютере экзешник, созданный в MFC запускается, а на других компьютерах - нет? Требует какую-то  dll-ку.===&lt;br /&gt;
Нужно выбирать режим Release :&lt;br /&gt;
&lt;br /&gt;
Menu-&amp;gt;Build-&amp;gt;Configurations...-&amp;gt;Release,&lt;br /&gt;
&lt;br /&gt;
и экзешник, соответственно, брать из папки Release проекта&lt;br /&gt;
===Как в диалог добавить меню?===&lt;br /&gt;
Надо сделать в ресурсах меню, затем вставить в диалог:&lt;br /&gt;
&lt;br /&gt;
открыть в редакторе диалог, в свойствах (во вкладке General, окошко Menu) указать идентивикатор ресурса меню.&lt;br /&gt;
При помощи визарда добавить для меню обработчики OnCommand() и OnUpdateСommand().&lt;br /&gt;
===Я добавил визардом меню в диалог. Добавил обработчики для пунктов меню. Но пункты работают, но OnUpdate для пунктов не вызывается - то есть не получается ни затенить, ни чек поставить. Что делать?===&lt;br /&gt;
В диалоге у меню апдейта не происходит сам, в отличие от мейнфрейма.&lt;br /&gt;
Для этого нужно сделать самим апдейт в обработчике сообщения WM_KICKIDLE.&lt;br /&gt;
Визардом обработчик не добавляется, поэтому можно переопределить виртуальную DefWindowProc() и там обработать:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;afxpriv.h&amp;gt;	//этот файл надо включить, там определёна WM_KICKIDLE&lt;br /&gt;
&lt;br /&gt;
LRESULT CMyDialog::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam) &lt;br /&gt;
{&lt;br /&gt;
	if(message==WM_KICKIDLE)&lt;br /&gt;
	{&lt;br /&gt;
		//делаем апдейт для всех пунктов меню&lt;br /&gt;
		CMenu* pMainMenu=GetMenu();&lt;br /&gt;
		if(pMainMenu)&lt;br /&gt;
		{&lt;br /&gt;
			CCmdUI cmdUI;&lt;br /&gt;
			for (UINT n=0; n &amp;lt; pMainMenu-&amp;gt;GetMenuItemCount(); ++n)&lt;br /&gt;
			{&lt;br /&gt;
				CMenu* pSubMenu = pMainMenu-&amp;gt;GetSubMenu(n);&lt;br /&gt;
				if(!pSubMenu)continue;&lt;br /&gt;
	&lt;br /&gt;
				cmdUI.m_nIndexMax = pSubMenu-&amp;gt;GetMenuItemCount();&lt;br /&gt;
				for (UINT i = 0; i &amp;lt; cmdUI.m_nIndexMax;++i)&lt;br /&gt;
				{&lt;br /&gt;
					cmdUI.m_nIndex = i;&lt;br /&gt;
					cmdUI.m_nID = pSubMenu-&amp;gt;GetMenuItemID(i);&lt;br /&gt;
					cmdUI.m_pMenu = pSubMenu;&lt;br /&gt;
					cmdUI.DoUpdate(this, FALSE);&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	return CDialog::DefWindowProc(message, wParam, lParam);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Как на Visual C++ 6.0 в Главном окне отключить системное меню (в левом верхнем углу) и кнопки(в правом верхнем углу) ?===&lt;br /&gt;
При создании окна нужно убрать стиль WS_SYSMENU&lt;br /&gt;
(теперь пользователь корректно может закрыть окно только Alt+F4  ,&lt;br /&gt;
ну или если вы предоставите ему дополнительную возможность сделать это )&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пример 1. (для SDI, MDI)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//этот обработчик уже добавлен визардом&lt;br /&gt;
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT&amp;amp; cs)&lt;br /&gt;
{&lt;br /&gt;
	if( !CFrameWnd::PreCreateWindow(cs) )&lt;br /&gt;
		return FALSE;&lt;br /&gt;
	// TODO: Modify the Window class or styles here by modifying&lt;br /&gt;
	//  the CREATESTRUCT cs&lt;br /&gt;
&lt;br /&gt;
	///////////////////////////////&lt;br /&gt;
	//добавленная часть&lt;br /&gt;
	{&lt;br /&gt;
		//убираем стиль&lt;br /&gt;
		cs.style&amp;amp;=~WS_SYSMENU;&lt;br /&gt;
	}&lt;br /&gt;
	///////////////////////////////&lt;br /&gt;
&lt;br /&gt;
	return TRUE;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Пример 2. (для диалога)&lt;br /&gt;
Если диалог описан в ресурсах, то в свойствах диалога убрать галочки&lt;br /&gt;
  &amp;quot;System menu&amp;quot;&lt;br /&gt;
  &amp;quot;Minimize box&amp;quot;&lt;br /&gt;
  &amp;quot;Maximize box&amp;quot;&lt;br /&gt;
===Хочу сделать так, чтобы пользователь не мог нажать на кнопку, пока программа не разрешит.===&lt;br /&gt;
Нужно применить метод класса CWnd::EnableWindow(...) для кнопки.&lt;br /&gt;
Значение параметра 0 делает кнопку неактивной, 1 - делает активной.&lt;br /&gt;
(кстати, не только для кнопки можно, а для любого класса, производного&lt;br /&gt;
от класса CWnd)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пример 1. Пусть имеется некий диалог, на нём лежит кнопка c ID == IDC_1.&lt;br /&gt;
в любом месте кода диалога (кроме конструктора и деструктора , хотя, если&lt;br /&gt;
проверить наличие валидного хендла диалога, как в примере, то ничего&lt;br /&gt;
страшного не будет и там)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//делаем кнопку неактивной&lt;br /&gt;
if(m_hWnd)&lt;br /&gt;
{&lt;br /&gt;
	CWnd* pw=0;&lt;br /&gt;
	pw=GetDlgItem(IDC_1);&lt;br /&gt;
	if(pw)pw-&amp;gt;EnableWindow(0);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Что означают сообщения, которые студия выводит при компиляции, вроде таких : Loaded 'C:\WINDOWS\SYSTEM\WSOCK32.DLL', no matching symbolic information found. ===&lt;br /&gt;
Это строка говорит о том, что студия не смогла найти отладочные&lt;br /&gt;
символы для WSOCK32.DLL. В этом нет ничего страшного, просто при наличии&lt;br /&gt;
отладочных символов в процессе отладки можно получить доступ к именам&lt;br /&gt;
функции из системных DLL. Например, вместо&lt;br /&gt;
 KERNEL32! 0x77E8B184() -&lt;br /&gt;
 увидим&lt;br /&gt;
 KERNEL32!CreateThread.&lt;br /&gt;
===Как обработать сообщения , которое приходит к некому контролу (скажем CEdit) ?===&lt;br /&gt;
Нужно произвести от CEdit свой класс, и в виртуальной процедуре класса WindowProc перехватить нужные сообщения.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
virtual LRESULT WindowProc(&lt;br /&gt;
   UINT message,&lt;br /&gt;
   WPARAM wParam,&lt;br /&gt;
   LPARAM lParam &lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Пример. Полностью выключаем, скажем, обработку сообщения WM_CHAR&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	LRESULT CMyEdit::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) &lt;br /&gt;
	{&lt;br /&gt;
		switch(message)&lt;br /&gt;
		{&lt;br /&gt;
			case WM_CHAR:&lt;br /&gt;
			{&lt;br /&gt;
				return 0;&lt;br /&gt;
			}&lt;br /&gt;
			break;&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		return CEdit::WindowProc(message, wParam, lParam);&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Чтобы связать экземпляр класса с контролом на форме, добавьте визардом для&lt;br /&gt;
контрола переменную класса (выбрав не Value а Control).&lt;br /&gt;
===Как настроить количество пробелов в табуляции?===&lt;br /&gt;
Tools-&amp;gt;Options-&amp;gt;Tabs-&amp;gt;Insert Spaces&lt;br /&gt;
(или  правой кнопкой мыши по тексту-&amp;gt; properties)&lt;br /&gt;
===Как автоматически расставить отступы?===&lt;br /&gt;
Выделить текст для форматирования, нажать Alt+F8&lt;br /&gt;
&lt;br /&gt;
Есть ещё программа Artistic Style, которая занимается&lt;br /&gt;
переформатированием кода&lt;br /&gt;
http://sourceforge.net/projects/astyle/&lt;br /&gt;
===Поиск границ блока===&lt;br /&gt;
&amp;quot;CTRL+ }&amp;quot; ищет парную фигурную скобку в тексте и переходит на неё&lt;br /&gt;
===Вертикальное выделение текста===&lt;br /&gt;
&amp;quot;Alt + выделение мышкой&amp;quot; - позволяет выделять вертикальные фрагменты текста&lt;br /&gt;
===Как узнать количество установленных в CListCtrl столбцов ?===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CListCtrl* pL=...; //указатель на переменную-контрол&lt;br /&gt;
&lt;br /&gt;
int count=pL-&amp;gt;GetHeaderCtrl()-&amp;gt;GetItemCount();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как получить иконку приложения?===&lt;br /&gt;
Если приложение запущено, то нужно найти его главное окно и&lt;br /&gt;
послать ему сообщение WM_GETICON.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//функция возвращант хендл иконки &lt;br /&gt;
LRESULT SendMessage(hWnd, WM_GETICON, wParam, 0);&lt;br /&gt;
&lt;br /&gt;
//hWnd == хендл окна приложения&lt;br /&gt;
//wParam == &lt;br /&gt;
//	1)==ICON_BIG - получить большую иконку&lt;br /&gt;
//	2)==ICON_SMALL - получить маленькую иконку&lt;br /&gt;
//	3)==ICON_SMALL2 - получить маленькую иконку, если она определена&lt;br /&gt;
//				в приложении. Если её нет, то маленькую иконку, &lt;br /&gt;
//				сгенерированную системой из большой иконки&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как в CString можно найти или вырезать часть строки?===&lt;br /&gt;
есть такие методы в CString :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//вырезает кусок строки&lt;br /&gt;
CString Mid(int nFirst) const;&lt;br /&gt;
CString Mid(int nFirst,  int nCount) const;&lt;br /&gt;
&lt;br /&gt;
//возвращает кусок строки (сначала или с конца)&lt;br /&gt;
CString Left(int nCount ) const;&lt;br /&gt;
CString Right(int nCount ) const;&lt;br /&gt;
&lt;br /&gt;
//возвращает начальный кусок строки, в котором есть только&lt;br /&gt;
//символы из набора,представленного в lpszCharSet&lt;br /&gt;
CString SpanIncluding(LPCTSTR lpszCharSet ) const;&lt;br /&gt;
&lt;br /&gt;
//возвращает начальный кусок строки, в котором нет&lt;br /&gt;
//символов из набора,представленного в lpszCharSet&lt;br /&gt;
CString SpanExcluding(LPCTSTR lpszCharSet ) const; &lt;br /&gt;
&lt;br /&gt;
//убирает &amp;quot;пробелоподобные&amp;quot; символы из самого начала строки&lt;br /&gt;
//(то есть - пробел, табуляцию (\t) , возврат каретки, перевод строки (/r/n))&lt;br /&gt;
void TrimLeft();&lt;br /&gt;
//убирает все повторы символа из самого начала строки&lt;br /&gt;
void TrimLeft(TCHAR chTarget );&lt;br /&gt;
//убирает из самого начала строки все символа из набора lpszTargets &lt;br /&gt;
void TrimLeft(LPCTSTR lpszTargets ); &lt;br /&gt;
&lt;br /&gt;
void TrimRight();&lt;br /&gt;
void TrimRight(TCHAR chTarget );&lt;br /&gt;
void TrimRight(LPCTSTR lpszTargets ); &lt;br /&gt;
&lt;br /&gt;
//поиск в строке&lt;br /&gt;
int Find( TCHAR ch ) const;&lt;br /&gt;
int Find( LPCTSTR lpszSub ) const;&lt;br /&gt;
int Find( TCHAR ch, int nStart ) const;&lt;br /&gt;
int Find( LPCTSTR pstr, int nStart ) const;&lt;br /&gt;
&lt;br /&gt;
//поиск, начиная с конца&lt;br /&gt;
int ReverseFind( TCHAR ch ) const;&lt;br /&gt;
&lt;br /&gt;
//поиск позиции первого символа, одного из набора,&lt;br /&gt;
// представленного в lpszCharSet&lt;br /&gt;
int FindOneOf( LPCTSTR lpszCharSet ) const;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Есть у меня CListBox и я в ходе выполнения программы добавляю в него строки. Но я не могу посмотреть что именно добавляется. Вывод результатов происходит в конце выполнения процедуры...===&lt;br /&gt;
Если нужно делать принудительную перерисовку окна во время&lt;br /&gt;
длительных вычислений, то нужно вызывать для окна, которое&lt;br /&gt;
надо перерисовать метод&lt;br /&gt;
  RedrawWindow()&lt;br /&gt;
с параметрами по умолчанию, или пару&lt;br /&gt;
  Invalidate(0);&lt;br /&gt;
  UpdateWindow();&lt;br /&gt;
Это приводит к пометке всего окна к перерисовке и отправлению&lt;br /&gt;
сообщения WM_PAINT в оконную процедуру в обход очереди&lt;br /&gt;
сообщений, вызывая немедленную перерисовку окна.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CWnd* pw=...;//окно , которое надо перерисовывать&lt;br /&gt;
&lt;br /&gt;
for(int i=0;i&amp;lt;10000)&lt;br /&gt;
{&lt;br /&gt;
	//меняется содержимое окна&lt;br /&gt;
	//...&lt;br /&gt;
&lt;br /&gt;
	//немедленная перерисовка&lt;br /&gt;
	pw-&amp;gt;Invalidate(0);&lt;br /&gt;
	pw-&amp;gt;UpdateWindow();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Я написал DLL , которую используют несколько приложений. Всё вроде работает, но когда происходит очередной вызов функции из DLL , почему то данные в функции обнуляются. С чем это связано ?===&lt;br /&gt;
Переменные и массивы в DLL, содержимое которых должно использоваться несколькими процессами, должны объявляться статическими. Статическая переменная или массив инициализируются только один раз в момент загрузки DLL.&lt;br /&gt;
Пример:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DWORD calltest()&lt;br /&gt;
{&lt;br /&gt;
	//будет выполнено только при первом вызове&lt;br /&gt;
	static DWORD callcount=0;&lt;br /&gt;
	static DWORD str[1000]={0}; &lt;br /&gt;
&lt;br /&gt;
	//будет выполняться каждый раз&lt;br /&gt;
	return ++callcount;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как открыть проекцию файла в память и как с ней работать?===&lt;br /&gt;
Как открыть проекцию файла в память и как с ней работать?&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HANDLE CreateFileMapping(&lt;br /&gt;
  HANDLE hFile,	//хендл уже открытого файла&lt;br /&gt;
  LPSECURITY_ATTRIBUTES lpAttributes,&lt;br /&gt;
  DWORD flProtect,	//способ открытия проекции&lt;br /&gt;
  DWORD dwMaximumSizeHigh,	//размер файла (старшие 4 байта , обычно==0)&lt;br /&gt;
  DWORD dwMaximumSizeLow,	//размер файла (младшие 4 байта)&lt;br /&gt;
  LPCTSTR lpName&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Доступ к созданной проекции производится процедурой&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LPVOID MapViewOfFile(&lt;br /&gt;
  HANDLE hFileMappingObject, //хендл проекции&lt;br /&gt;
  DWORD dwDesiredAccess,	//способ работы с проекцией&lt;br /&gt;
  DWORD dwFileOffsetHigh,&lt;br /&gt;
  DWORD dwFileOffsetLow, //смещение от начала файла (младшие 4 байта)&lt;br /&gt;
  SIZE_T dwNumberOfBytesToMap //длина в байтах (если ==0 - то весь файл)&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
далее с файлом можно работать как с обычным массивом в памяти.&lt;br /&gt;
&lt;br /&gt;
После работы с проекцией , её надо освободить процедурой&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
BOOL UnmapViewOfFile(&lt;br /&gt;
  LPCVOID lpBaseAddress //адрес, который вернула процедура MapViewOfFile&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Пример.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HANDLE hMapFile=0;//для проекции&lt;br /&gt;
&lt;br /&gt;
HANDLE hFile=...;//хендл уже открытого файла&lt;br /&gt;
DWORD dwdFileLen=...;//размер открытого файла&lt;br /&gt;
&lt;br /&gt;
//создаём проекцию &amp;quot;только для чтения&amp;quot;&lt;br /&gt;
hMapFile=::CreateFileMapping(hFile,0,PAGE_READONLY,0,dwdFileLen,0);&lt;br /&gt;
&lt;br /&gt;
//хендл hFile можно закрыть уже здесь, в принципе,&lt;br /&gt;
//но мы сделаем это позже&lt;br /&gt;
&lt;br /&gt;
//получаем доступ к проекции (тоже только для чтения)&lt;br /&gt;
BYTE* pbyFile=(BYTE*)::MapViewOfFile(hMapFile,FILE_MAP_READ,0,0,0);&lt;br /&gt;
&lt;br /&gt;
///////////////////&lt;br /&gt;
//тут работаем с массивом pbyFile[dwdFileLen] как с обычным,&lt;br /&gt;
//только не забываем, что он открыт только для чтения&lt;br /&gt;
//...&lt;br /&gt;
//...&lt;br /&gt;
//...&lt;br /&gt;
///////////////////&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//отключаем файл данных от адресного пространства&lt;br /&gt;
UnmapViewOfFile(pbyFile);&lt;br /&gt;
&lt;br /&gt;
//освобождаем хендл проекции&lt;br /&gt;
CloseHandle(hMapFile)&lt;br /&gt;
&lt;br /&gt;
//освобождаем хендл открытого файла&lt;br /&gt;
CloseHandle(hFile);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Использую MFC Grid control 2.25 , не получается отобразить картинку в ячейке. Как это делается ?===&lt;br /&gt;
Нужно создать список изображений (CImageList) , затем передать указатель на список в контрол. Поскольку контрол лишь копирует указатель , список должен создаваться динамически, либо быть членом класса, экземпляр которого существует всё время работы контрола.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 m_GridMarket&lt;br /&gt;
CImageList m_ImageList;&lt;br /&gt;
CGridCtrL m_Grid1&lt;br /&gt;
...&lt;br /&gt;
...&lt;br /&gt;
//неким образом создаётся список&lt;br /&gt;
m_ImageList.Create(...);&lt;br /&gt;
//...&lt;br /&gt;
&lt;br /&gt;
//вставляем в контрол&lt;br /&gt;
m_Grid1.SetImageList(&amp;amp;m_ImageList);&lt;br /&gt;
&lt;br /&gt;
//&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как при помощи IPicture отобразить картинку из файла? ===&lt;br /&gt;
Пример - несложная функция, отображающая картинку из файла&lt;br /&gt;
&lt;br /&gt;
поддерживаются форматы&lt;br /&gt;
BMP, GIF, JPEG, PNG, TIFF, EMF&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;quot;atlconv.h&amp;quot;&lt;br /&gt;
#define HandleIsValid(H) (H!=(HANDLE)-1 &amp;amp;&amp;amp; H!=(HANDLE)0)&lt;br /&gt;
&lt;br /&gt;
//*pDestDC - CDC, на который предполагается вывод картинки&lt;br /&gt;
//pchzFilePath - путь к файлу&lt;br /&gt;
//pWid - (возвращает) ширина картинки&lt;br /&gt;
//pHig - (возвращает) высота картинки&lt;br /&gt;
bool DrawBitmapFromFile(CDC* pDestDC,const char* pchzFilePath,int *pWid=0,int *pHig=0)&lt;br /&gt;
{&lt;br /&gt;
	bool result=false;&lt;br /&gt;
&lt;br /&gt;
	if(pWid)*pWid=0;&lt;br /&gt;
	if(pHig)*pHig=0;&lt;br /&gt;
&lt;br /&gt;
	int Wid=0;&lt;br /&gt;
	int Hig=0;&lt;br /&gt;
&lt;br /&gt;
	IPicture* pPic=0;&lt;br /&gt;
	try&lt;br /&gt;
	{&lt;br /&gt;
		IPicture* ptmpPic=0;&lt;br /&gt;
		USES_CONVERSION;&lt;br /&gt;
		HRESULT hr;&lt;br /&gt;
&lt;br /&gt;
		CString txt=pchzFilePath;&lt;br /&gt;
		hr= ::OleLoadPicturePath(&lt;br /&gt;
			const_cast&amp;lt;LPOLESTR&amp;gt;(T2COLE(txt)),&lt;br /&gt;
			0,0,0,IID_IPicture,&lt;br /&gt;
			reinterpret_cast&amp;lt;void **&amp;gt;(&amp;amp;ptmpPic)&lt;br /&gt;
			);&lt;br /&gt;
&lt;br /&gt;
		if(hr==S_OK &amp;amp;&amp;amp; ptmpPic)&lt;br /&gt;
		{&lt;br /&gt;
			pPic=ptmpPic;&lt;br /&gt;
		}&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			throw 0;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		OLE_XPOS_HIMETRIC cxSrc;&lt;br /&gt;
		OLE_YPOS_HIMETRIC cySrc;&lt;br /&gt;
&lt;br /&gt;
		if(S_OK!=pPic-&amp;gt;get_Width(&amp;amp;cxSrc))throw 0;&lt;br /&gt;
		if(S_OK!=pPic-&amp;gt;get_Height(&amp;amp;cySrc))throw 0;&lt;br /&gt;
&lt;br /&gt;
		Wid=cxSrc/26;&lt;br /&gt;
		Hig=cySrc/26;&lt;br /&gt;
&lt;br /&gt;
		//рисуем&lt;br /&gt;
		if(S_OK !=pPic-&amp;gt;Render(pDestDC-&amp;gt;GetSafeHdc(),&lt;br /&gt;
			0,Hig,Wid,-Hig,0,0,cxSrc,cySrc,0))throw 0;&lt;br /&gt;
	}&lt;br /&gt;
	catch(...)&lt;br /&gt;
	{&lt;br /&gt;
		result=false;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if(pPic)&lt;br /&gt;
	{&lt;br /&gt;
		pPic-&amp;gt;Release();&lt;br /&gt;
		pPic=0;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	if(pWid)*pWid=Wid;&lt;br /&gt;
	if(pHig)*pHig=Hig;&lt;br /&gt;
&lt;br /&gt;
	return result;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===У меня модальное диалоговое окно, в нем поле редактирования мультилайновое, т.е. чтобы перейти на новую строку надо нажать ентер, но вызывается стандартный обработчик диалогового окна. Подскажите, что делать?===&lt;br /&gt;
Нужно в редакторе ресурсов поставить для CEdit окошка галочку&lt;br /&gt;
свойства WantReturn,&lt;br /&gt;
&lt;br /&gt;
или добавить ES_WANTRETURN при создании CEdit контрола динамически.&lt;br /&gt;
===Как выводят картинку-логотип(splash screen) при запуске программы? То есть, когда загружается программа на экран выводится картинка, потом она исчезает(загрузка программы закончена) и пользователь может приступать к работе ===&lt;br /&gt;
Для этого используется класс, производный от CDialog. Этот диалог после создания показывает себя на экран, выводя на себя рисунок. Также запускает таймет, по срабатывани которого диалог гасится. Создаётся диалог InitInstance приложения.&lt;br /&gt;
&lt;br /&gt;
В VC6++ также есть уже готовый компонент&lt;br /&gt;
Project-&amp;gt;Add To Project -&amp;gt; Components and Controls-&amp;gt;(в папке &amp;quot;Visual C++ Components&amp;quot; есть SplashScreen.)&lt;br /&gt;
===Как сделать, чтобы при выпадении списка у ComboBox была не одна строка, а больше, вроде все свойства покрутил, не помогает Вместо выпадающего списка одна строка и скролл...===&lt;br /&gt;
В редакторе ресурсов надо щелкнуть в комбобоксе на треугольнике - появляется рамка для растягивания вниз - размер выпадающего списка.&lt;br /&gt;
===В VC++.net , что делать после того, как на форму установил ActiiveX ListView, как объявить класс и переменную для этого элемента?===&lt;br /&gt;
Щёлкнуть правой кнопкой мыши на элементе , в меню - add variable или add class&lt;br /&gt;
===Как вставить данные в буфер обмена (Clipboard) ? Как их оттуда вытащить ?===&lt;br /&gt;
&lt;br /&gt;
1) копирование в буфер обмена:&lt;br /&gt;
&lt;br /&gt;
  1.Готовим данные&lt;br /&gt;
    а.Выделяем память из кучи,  вызывая GlobalAlloc()&lt;br /&gt;
    б.Получаем указатель на выделенную память, вызывая GlobalLock()&lt;br /&gt;
    в.Заполняем данные&lt;br /&gt;
    г.Освобождаем указатель , вызывая GlobalUnlock();&lt;br /&gt;
&lt;br /&gt;
  2.Открываем буфер обмена , вызывая OpenClipboard();&lt;br /&gt;
  3.Очищаем буфер, вызывая EmptyClipboard();&lt;br /&gt;
  4.Вызываем SetClipboardData() один раз для каждого формата&lt;br /&gt;
      вставляемых данных (имеется в виду - если одни и те же&lt;br /&gt;
      данные представлены в разных форматах, и приложение&lt;br /&gt;
      может эти форматы создать)&lt;br /&gt;
  5.Закрываем буфер, вызывая CloseClipboard();&lt;br /&gt;
  6.ВЫЗЫВАТЬ GlobalFree() НЕ НУЖНО , в этом случае это&lt;br /&gt;
      предоставлено системе&lt;br /&gt;
&lt;br /&gt;
Скажем, хотим поместить в буфер обмена туда текст.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	//готовим данные&lt;br /&gt;
	//выделяем из кучи память для данных&lt;br /&gt;
	HANDLE hglbCopy = GlobalAlloc(GMEM_MOVEABLE,10);&lt;br /&gt;
	if(!hglbCopy)return;&lt;br /&gt;
&lt;br /&gt;
	//получаем указатель&lt;br /&gt;
	void* lpStr = GlobalLock(hglbCopy);&lt;br /&gt;
	if(!lpStr)return;&lt;br /&gt;
&lt;br /&gt;
	//заполняем данные&lt;br /&gt;
	strcpy((char*)lpStr,&amp;quot;my text&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	//освобождаем указатель&lt;br /&gt;
	GlobalUnlock(hglbCopy);&lt;br /&gt;
	lpStr=0;&lt;br /&gt;
&lt;br /&gt;
	//открываем буфер обмена&lt;br /&gt;
	OpenClipboard();&lt;br /&gt;
	//очищаем&lt;br /&gt;
	EmptyClipboard();&lt;br /&gt;
&lt;br /&gt;
	//текстовый формат&lt;br /&gt;
	SetClipboardData(CF_TEXT,hglbCopy);&lt;br /&gt;
&lt;br /&gt;
	//закрываем буфер&lt;br /&gt;
	CloseClipboard();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
2) извлечение из буфера обмена&lt;br /&gt;
&lt;br /&gt;
  1.Проверяем, что поддерживается нужный формат данных,&lt;br /&gt;
      вызывая IsClipboardFormatAvailable()&lt;br /&gt;
  2.Открываем буфер обмена , вызывая OpenClipboard();&lt;br /&gt;
  3.Достаём данные&lt;br /&gt;
   а.Получаем из буфера хендл требуемого формата,&lt;br /&gt;
      вызывая GetClipboardData()&lt;br /&gt;
    б.Получаем указатель на выделенную память, вызывая GlobalLock()&lt;br /&gt;
    в.Работаем с данными&lt;br /&gt;
    г.Освобождаем указатель , вызывая GlobalUnlock();&lt;br /&gt;
  4.Закрываем буфер, вызывая CloseClipboard();&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	//Проверяем, что поддерживается нужный формат данных,&lt;br /&gt;
	if(!IsClipboardFormatAvailable(CF_TEXT))return;&lt;br /&gt;
&lt;br /&gt;
	//открываем буфер обмена&lt;br /&gt;
	OpenClipboard();&lt;br /&gt;
&lt;br /&gt;
	//достаём данные&lt;br /&gt;
&lt;br /&gt;
	//текстовый формат&lt;br /&gt;
	HANDLE hglbCopy = GetClipboardData(CF_TEXT);&lt;br /&gt;
	if(!hglbCopy)return;&lt;br /&gt;
&lt;br /&gt;
	//получаем указатель&lt;br /&gt;
	void* lpStr = GlobalLock(hglbCopy);&lt;br /&gt;
	if(!lpStr)return;&lt;br /&gt;
&lt;br /&gt;
	//читаем данные&lt;br /&gt;
	char data[10];&lt;br /&gt;
	memmove(data,lpStr,sizeof(data));&lt;br /&gt;
&lt;br /&gt;
	//освобождаем указатель&lt;br /&gt;
	GlobalUnlock(hglbCopy);&lt;br /&gt;
	lpStr=0;&lt;br /&gt;
&lt;br /&gt;
	//закрываем буфер&lt;br /&gt;
	CloseClipboard();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как получить полный путь к экзешнику из самой программы ?===&lt;br /&gt;
В командную строку первым параметром система всегда передаёт заключённый в кавычки полный путь к файлу запущенной программы Достаём путь таким образом :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
BOOL CMyApp::InitInstance()&lt;br /&gt;
{&lt;br /&gt;
	//добыча полного имени экзешника&lt;br /&gt;
	CString csFullExeName;&lt;br /&gt;
	{&lt;br /&gt;
		CString csAppName=GetCommandLine();&lt;br /&gt;
		csAppName.Delete(0,1);&lt;br /&gt;
		csAppName.Replace('\&amp;quot;','\0');&lt;br /&gt;
		csFullExeName=(const char*)csAppName;&lt;br /&gt;
	}&lt;br /&gt;
	//теперь csFullExeName - содержит искомый путь&lt;br /&gt;
&lt;br /&gt;
	//...&lt;br /&gt;
	//...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Каким способом можно exe файл может заменить самого себя? То есть, моя программа обновляется, например, через Internet, и хочет обновить свой exe-файл. Но так как он в данный момент запущен - это будет, естественно, запрещено. Как это можно проще всего сделать?===&lt;br /&gt;
Один из способов - сделать копию экзешника и из него обновиться&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define def_exeNAMEup	&amp;quot;c:\\myprog_update.exe&amp;quot;&lt;br /&gt;
#define def_exeNAMEdnld	&amp;quot;c:\\myprog_downloaded.exe&amp;quot;&lt;br /&gt;
#define def_keyUdate	&amp;quot;/update&amp;quot;&lt;br /&gt;
&lt;br /&gt;
void CTESTFAQApp::UpdateItself()&lt;br /&gt;
{&lt;br /&gt;
	//добыча полного имени экзешника&lt;br /&gt;
	CString csFullExeName;&lt;br /&gt;
	{&lt;br /&gt;
		CString csAppName=GetCommandLine();&lt;br /&gt;
		csAppName.Delete(0,1);&lt;br /&gt;
		csAppName.Replace('\&amp;quot;','\0');&lt;br /&gt;
		csFullExeName=(const char*)csAppName;&lt;br /&gt;
	}&lt;br /&gt;
	//теперь csFullExeName - содержит искомый путь&lt;br /&gt;
&lt;br /&gt;
	//делаем копию экзешника с другим именем&lt;br /&gt;
	CopyFile(csFullExeName,def_exeNAMEup,0);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	//передаём в параметры нового процесса ключ и путь к текущему файлу&lt;br /&gt;
	CString csParams=def_keyUdate;&lt;br /&gt;
	csParams+=&amp;quot; &amp;quot;;&lt;br /&gt;
	csParams+=csFullExeName;&lt;br /&gt;
&lt;br /&gt;
	//запускаем копию&lt;br /&gt;
	STARTUPINFO si;&lt;br /&gt;
	PROCESS_INFORMATION pi;&lt;br /&gt;
	ZeroMemory(&amp;amp;si,sizeof(si));&lt;br /&gt;
	si.cb = sizeof(si);&lt;br /&gt;
	ZeroMemory(&amp;amp;pi,sizeof(pi));&lt;br /&gt;
	if(CreateProcess(def_exeNAMEup,def_keyUdate,0,0,0,0,0,0,&amp;amp;si,&amp;amp;pi))&lt;br /&gt;
	{&lt;br /&gt;
		//завершаем текущий процесс&lt;br /&gt;
		ExitFromMyApp();&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void CTESTFAQApp::ExitFromMyApp()&lt;br /&gt;
{&lt;br /&gt;
	exit(0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
BOOL CTESTFAQApp::InitInstance()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
	//смотрим, не запустили ли для апдейта?&lt;br /&gt;
&lt;br /&gt;
	CString txt;&lt;br /&gt;
	txt=m_lpCmdLine;&lt;br /&gt;
	if(txt.Find(def_keyUdate)==0)&lt;br /&gt;
	{&lt;br /&gt;
		//делаем айдейт&lt;br /&gt;
		txt.Replace(def_keyUdate,&amp;quot;&amp;quot;);&lt;br /&gt;
		txt.TrimLeft();&lt;br /&gt;
&lt;br /&gt;
		CString csFullExeName=txt;&lt;br /&gt;
&lt;br /&gt;
		//берём откуда то уже скачанный файл обновления&lt;br /&gt;
		//...&lt;br /&gt;
		CString csFull_Downloaded_ExeName=def_exeNAMEdnld;&lt;br /&gt;
&lt;br /&gt;
		//копируем файл (обновляем старый то есть)&lt;br /&gt;
		CopyFile(csFull_Downloaded_ExeName,csFullExeName,0);&lt;br /&gt;
&lt;br /&gt;
		//запускаем обновлённого мученника&lt;br /&gt;
		STARTUPINFO si;&lt;br /&gt;
		PROCESS_INFORMATION pi;&lt;br /&gt;
		ZeroMemory(&amp;amp;si,sizeof(si));&lt;br /&gt;
		si.cb = sizeof(si);&lt;br /&gt;
		ZeroMemory(&amp;amp;pi,sizeof(pi));&lt;br /&gt;
		if(CreateProcess(csFullExeName,0,0,0,0,0,0,0,&amp;amp;si,&amp;amp;pi))&lt;br /&gt;
&lt;br /&gt;
		ExitFromMyApp();&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
	//...&lt;br /&gt;
	//...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Есть строка символов (страничка из Инета) в кодировке utf-8 (строка char*). Как мне ее получить в формате String&lt;br /&gt;
или в char* в кодировке ANSI (cp 1251) ?===&lt;br /&gt;
Можно перевести строку из UTF8 в Unicode, затем из Unicode в 1251&lt;br /&gt;
&lt;br /&gt;
Ниже приведена структура, содержащая процедуры перекодирования,&lt;br /&gt;
а также процедуру с примером использования&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//описание структуры&lt;br /&gt;
struct coder&lt;br /&gt;
{&lt;br /&gt;
	//utf8-&amp;gt;unicode&lt;br /&gt;
	static wchar_t* utf8_to_unicode__dontForgetDeleteArr(const char *utf8_string)&lt;br /&gt;
	{&lt;br /&gt;
		wchar_t* pRes=0;&lt;br /&gt;
		int res_len=0;&lt;br /&gt;
&lt;br /&gt;
		//тест на возможность преобразования&lt;br /&gt;
		res_len=MultiByteToWideChar(CP_UTF8,0,utf8_string,-1,0,0);&lt;br /&gt;
		if(!res_len)return 0;&lt;br /&gt;
&lt;br /&gt;
		//выделяем память&lt;br /&gt;
		pRes = new wchar_t[res_len];&lt;br /&gt;
		if(!pRes)return 0;&lt;br /&gt;
&lt;br /&gt;
		//преобразование&lt;br /&gt;
		if(!MultiByteToWideChar(CP_UTF8,0,utf8_string,-1,pRes,res_len))&lt;br /&gt;
		{&lt;br /&gt;
			delete [] pRes;&lt;br /&gt;
			return 0;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		return pRes;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	//unicode-&amp;gt;1251&lt;br /&gt;
	static char * unicode_to_1251__dontForgetDeleteArr(const wchar_t *unicode_string)&lt;br /&gt;
	{&lt;br /&gt;
		char* pRes=0;&lt;br /&gt;
		int res_len=0;&lt;br /&gt;
&lt;br /&gt;
		//тест на возможность преобразования&lt;br /&gt;
		res_len = WideCharToMultiByte(1251,0,unicode_string,-1,0,0,0,0);&lt;br /&gt;
		if(!res_len)return 0;&lt;br /&gt;
&lt;br /&gt;
		//выделяем память&lt;br /&gt;
		pRes=new char[res_len];&lt;br /&gt;
		if(!pRes)return 0;&lt;br /&gt;
&lt;br /&gt;
		//преобразование&lt;br /&gt;
		if(!WideCharToMultiByte(1251,0,unicode_string,-1,pRes,res_len,0,0))&lt;br /&gt;
		{&lt;br /&gt;
			delete [] pRes;&lt;br /&gt;
			return 0;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		return pRes;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	//процедура с примером&lt;br /&gt;
	static void Example()&lt;br /&gt;
	{&lt;br /&gt;
		wchar_t* unicode_string=0;&lt;br /&gt;
		char* cp1251_string=0;&lt;br /&gt;
&lt;br /&gt;
		//исходный текст&lt;br /&gt;
		char utf8_string[] = &amp;quot;UTF-8 + СЂСѓСЃСЃРєРёР№ С‚РµРєСЃС‚&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
		for(;;)&lt;br /&gt;
		{&lt;br /&gt;
&lt;br /&gt;
			unicode_string=utf8_to_unicode__dontForgetDeleteArr(utf8_string);&lt;br /&gt;
			if(!unicode_string)&lt;br /&gt;
			{&lt;br /&gt;
				AfxMessageBox(&amp;quot;Не удалось конвертировать в unicode!&amp;quot;);&lt;br /&gt;
				break;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			cp1251_string = unicode_to_1251__dontForgetDeleteArr(unicode_string);&lt;br /&gt;
&lt;br /&gt;
			if(!cp1251_string)&lt;br /&gt;
			{&lt;br /&gt;
				AfxMessageBox(&amp;quot;Не удалось конвертировать из unicode!&amp;quot;);&lt;br /&gt;
				break;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			break;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		//cp1251_string - результат&lt;br /&gt;
		AfxMessageBox(cp1251_string);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
		//не забываем удалить массивы&lt;br /&gt;
		if(unicode_string)&lt;br /&gt;
		{&lt;br /&gt;
			delete [] unicode_string;&lt;br /&gt;
			unicode_string=0;&lt;br /&gt;
		}&lt;br /&gt;
		if(cp1251_string)&lt;br /&gt;
		{&lt;br /&gt;
			delete [] cp1251_string;&lt;br /&gt;
			cp1251_string=0;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
//вызов примера&lt;br /&gt;
coder::Example();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как организовать взаимодействие программы на VC.net с Access-овской базой данных?===&lt;br /&gt;
Проще всего подключить ADO компоненты и сделать все на них.&lt;br /&gt;
Компоненты  ADO (ADODC,DATAGRID и т.п.) это ActiveX.&lt;br /&gt;
В редакторе ресурсов, во всплывающем меню, есть Insert ActiveX Control -&amp;gt; открывается список всех компоент,&lt;br /&gt;
зарегистрированых на машине. Нужно найти компоненты (Это компоненты от MS и они помечены (OLEDB)) и вставить их в диалог. Для того что бы иметь возможность управлять ими, нужно импортировать обертки для них, это делается при помощи ClassWisard, там есть импорт-&amp;gt;класс-&amp;gt;указать файл с компоентой (OSX).&lt;br /&gt;
Появляется список всех классов, объявленых внутри.&lt;br /&gt;
Проставляем галочки, нажимаем ОК.&lt;br /&gt;
&lt;br /&gt;
[[Category:FAQ]]&lt;/div&gt;</summary>
		<author><name>Mczim</name></author>	</entry>

	<entry>
		<id>https://wiki.shelek.ru/index.php?title=FAQ:WinAPI,_VCPP_Part_3&amp;diff=405</id>
		<title>FAQ:WinAPI, VCPP Part 3</title>
		<link rel="alternate" type="text/html" href="https://wiki.shelek.ru/index.php?title=FAQ:WinAPI,_VCPP_Part_3&amp;diff=405"/>
				<updated>2008-08-14T18:32:12Z</updated>
		
		<summary type="html">&lt;p&gt;Mczim: удалил пункт два 2) так как он был пустой. и убрал цифру 1) так как пункт остался единственным&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Имеется приложение на основе CRichEditView. Как узнать, что пользователь меняет текст?===&lt;br /&gt;
Добавить обработчик сообщения EN_CHANGE. Сообщение генерируется CRichEditView каждый раз, когда пользователь изменяет текст в окне CRichEditView&lt;br /&gt;
===Чем метод CArray::GetSize отличается от метода CArray::GetCount?===&lt;br /&gt;
Абсолютно ничем. (Скорее всего, были предыдущие библиотеки, в которых функции, одинаковые по смыслу, имели разные имена. Поэтому в целях совместимости оставили оба)&lt;br /&gt;
===Как загрузить строку из ресурса?===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CString m_Temp;&lt;br /&gt;
m_Temp.LoadString(ID_MYSTRING);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как поменять иконку у элемента (item) в CListCtrl?===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//заполняем структуру LVITEM&lt;br /&gt;
LVITEM lvItem;&lt;br /&gt;
memset(&amp;amp;lvItem,0,sizeof(lvItem));&lt;br /&gt;
	&lt;br /&gt;
lvItem.mask = LVIF_IMAGE;//меняться будет картинка&lt;br /&gt;
lvItem.iItem = ...;// индекс элемента списка (Zero-based)&lt;br /&gt;
lvItem.iSubItem = 0;&lt;br /&gt;
lvItem.iImage = ...; //индекс иконки (из списка контрола)&lt;br /&gt;
	&lt;br /&gt;
pList-&amp;gt;SetItem(&amp;amp; lvItem);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Имеется класс Class1, содержащий мембер типа указатель на Class2. В Class2 также имеется указатель на Class1. Компилятор выдаёт ошибку. Что надо делать?===&lt;br /&gt;
Предварительно объявляем класс Class2. Тогда компилятору будет известно, что описание класса Class2 будет встречено дальше, и станет возможным объявление указателей на класс до описания самого класса.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Class2;//предопределение&lt;br /&gt;
	&lt;br /&gt;
Class1&lt;br /&gt;
{&lt;br /&gt;
	Class2* p;&lt;br /&gt;
};&lt;br /&gt;
	&lt;br /&gt;
Class2&lt;br /&gt;
{&lt;br /&gt;
	Class1* p;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как переключить раскладку в другом (то есть в активном) процессе?===&lt;br /&gt;
Использовать функции:&lt;br /&gt;
   GetKeyboardLayout - определить текущую раскладку&lt;br /&gt;
   LoadKeyboardLayout - загрузить новую раскладку&lt;br /&gt;
&lt;br /&gt;
см.также&lt;br /&gt;
   VerLanguageName - получить строку с описанием языка&lt;br /&gt;
&lt;br /&gt;
(подробности - в MSDN)&lt;br /&gt;
===Как получить хендл контрола Edit зная его ID?===&lt;br /&gt;
Пусть контрол лежит на окне CMyWnd&lt;br /&gt;
Тогда:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void CMyWnd::некая_процедура()&lt;br /&gt;
{&lt;br /&gt;
	//для MFC&lt;br /&gt;
	CEdit* ed=(CEdit* ) GetDlgItem(ID_EDIT1);&lt;br /&gt;
	HWND hwnd=ed-&amp;gt;GetSafeHwnd();&lt;br /&gt;
	...&lt;br /&gt;
	&lt;br /&gt;
	//для Win32 API&lt;br /&gt;
	HWND hwnd=GetDlgItem(m_hWnd,ID_EDIT1);&lt;br /&gt;
	...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Как из дочернего окна закрыть приложение?===&lt;br /&gt;
Нужно послать родительскому окну (*pParent) сообщение WM_CLOSE:&lt;br /&gt;
 pParent-&amp;gt;PostMessage(WM_CLOSE);//MFC&lt;br /&gt;
или&lt;br /&gt;
 ::PostMessage(pParent-&amp;gt;m_hWnd,WM_CLOSE,(WPARAM)0,(LPARAM)0);//API&lt;br /&gt;
===Как корректно перевести BSTR в CString и наоборот?===&lt;br /&gt;
Нужно просто присвоить переменной типа CString переменную типа BSTR.&lt;br /&gt;
Оператор = класса CString сам всё переведёт.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//указатель на будущий буфер с BSTR.&lt;br /&gt;
//	(По сути, BSTR определён как &lt;br /&gt;
//	typedef WCHAR* BSTR;&lt;br /&gt;
//	то есть указатель на 16-битный символ юникод)&lt;br /&gt;
	&lt;br /&gt;
BSTR bstrHE=0;&lt;br /&gt;
	&lt;br /&gt;
CString Str=&amp;quot;мой текст&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
//Выделить память и загрузить адрес блока в bstrHE&lt;br /&gt;
bstrHE=Str.AllocSysString();&lt;br /&gt;
	&lt;br /&gt;
//...	&lt;br /&gt;
//тут работаем с bstrHE[]&lt;br /&gt;
//...&lt;br /&gt;
	&lt;br /&gt;
//освобождаем память&lt;br /&gt;
SysFreeString(bstrHE);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Как получить доступ к графическим ресурсам элементов текущей темы оформления Windows?===&lt;br /&gt;
Использовать функции&lt;br /&gt;
&lt;br /&gt;
OpenThemeData()&lt;br /&gt;
DrawThemeBackground()&lt;br /&gt;
DrawFrameControl()&lt;br /&gt;
CloseThemeData().&lt;br /&gt;
&lt;br /&gt;
(подробности - в MSDN)&lt;br /&gt;
===Имеется класс , производный от CDialog. Когда диалог в фокусе, нажатие на Enter или Esc приводит к закрытию диалога. Как это запретить?===&lt;br /&gt;
При нажатии Enter происходит выполнение команды IDOK,&lt;br /&gt;
при нажатии Esc - IDCANCEL.&lt;br /&gt;
Нужно переопределить в классе виртуальные функции OnOk() и OnCancel(),&lt;br /&gt;
которые соответственно вызываются для этих команд. При помощи&lt;br /&gt;
визарда эти функции добавить можно так: Положить на диалог две кнопки&lt;br /&gt;
с идентификаторами IDOK и IDCANCEL (при создании нового диалога они там&lt;br /&gt;
есть сразу), затем двойной клик по кнопке добавляет соответствующий&lt;br /&gt;
обработчик. В обработчиках надо удалить вызовы СDialog::OnOK() и&lt;br /&gt;
CDialog::OnCancel(), тогда диалог закрываться не будет.&lt;br /&gt;
Однако тогда диалог станет невозможно закрыть кнопкой с крестиком  :)&lt;br /&gt;
&lt;br /&gt;
Лечить так: добавить обработчик сообщения WM_CLOSE - OnClose(), и в нём&lt;br /&gt;
сделать вызов OnOk() или OnCancel() :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void CPlayersPropsDialog::OnClose() &lt;br /&gt;
{&lt;br /&gt;
	CDialog::OnClose();&lt;br /&gt;
	CDialog::OnCancel();//добавлено&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===VC++6. Я написал простейший макрос, а компилятор на него ругается. ума не приложу, что за глюк?===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	#define my_macr(x,y,z) \&lt;br /&gt;
		z=\&lt;br /&gt;
		(x+y)*\&lt;br /&gt;
		(x-y)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Скорее всего после одного из символов соединения строк &amp;quot;\&amp;quot; имеется&lt;br /&gt;
пробел или табуляция. Их надо удалить. Можно найти их &amp;quot;наощупь&amp;quot;, а&lt;br /&gt;
можно включить показ непечатных символов в студии. Найти эту команду&lt;br /&gt;
можно так:&lt;br /&gt;
Tools-&amp;gt;Customize...-&amp;gt;вкладка Commands. , В окошке Category выбрать&lt;br /&gt;
&amp;quot;Edit&amp;quot;, и среди кнопок справа найти кнопку , на которой написано &amp;quot;a.b&amp;quot;&lt;br /&gt;
Эту кнопку надо перетащить на одну из панелей инструментов студии.&lt;br /&gt;
===Как получить список всех процесов, включая idle ?===&lt;br /&gt;
Использовать функции&lt;br /&gt;
Process32First()&lt;br /&gt;
Precess32Next()&lt;br /&gt;
===Как программно установить переменные окружения?===&lt;br /&gt;
Чтобы добавить или изменить их программно, необходимо воспользоваться&lt;br /&gt;
ключом реестра HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\&lt;br /&gt;
Session Manager\Environment, а затем отправить широковещательное&lt;br /&gt;
сообщение WM_SETTINGCHANGE. Это позволит приложениям узнать об&lt;br /&gt;
изменениях:&lt;br /&gt;
&lt;br /&gt;
::SendMessage(HWND_BROADCAST,WM_SETTINGCHANGE,0,0);&lt;br /&gt;
===Как сделать,чтобы у окна был черный фон?===&lt;br /&gt;
переопределить обработчик сообщения WM_CTLCOLOR - OnCtlColor() :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CBrush br(RGB(0,0,0));&lt;br /&gt;
	&lt;br /&gt;
HBRUSH CMyDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) &lt;br /&gt;
{&lt;br /&gt;
	HBRUSH hbr = CMyDlg::OnCtlColor(pDC, pWnd, nCtlColor);&lt;br /&gt;
	&lt;br /&gt;
	//фон диалога (или вьюшки)&lt;br /&gt;
	if(nCtlColor==CTLCOLOR_DLG)&lt;br /&gt;
	{&lt;br /&gt;
		return (HBRUSH)br;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	//фон статиков (если нужно)&lt;br /&gt;
	if(nCtlColor==CTLCOLOR_STATIC)&lt;br /&gt;
	{&lt;br /&gt;
		//делаем фон текста статика прозрачным&lt;br /&gt;
		pDC-&amp;gt;SetBkMode(TRANSPARENT);&lt;br /&gt;
		return (HBRUSH)br;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	return hbr;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Почему на моем компьютере экзешник, созданный в MFC запускается, а на других компьютерах - нет? Требует какую-то  dll-ку.===&lt;br /&gt;
Нужно выбирать режим Release :&lt;br /&gt;
&lt;br /&gt;
Menu-&amp;gt;Build-&amp;gt;Configurations...-&amp;gt;Release,&lt;br /&gt;
&lt;br /&gt;
и экзешник, соответственно, брать из папки Release проекта&lt;br /&gt;
===Как в диалог добавить меню?===&lt;br /&gt;
Надо сделать в ресурсах меню, затем вставить в диалог:&lt;br /&gt;
&lt;br /&gt;
открыть в редакторе диалог, в свойствах (во вкладке General, окошко Menu) указать идентивикатор ресурса меню.&lt;br /&gt;
При помощи визарда добавить для меню обработчики OnCommand() и OnUpdateСommand().&lt;br /&gt;
===Я добавил визардом меню в диалог. Добавил обработчики для пунктов меню. Но пункты работают, но OnUpdate для пунктов не вызывается - то есть не получается ни затенить, ни чек поставить. Что делать?===&lt;br /&gt;
В диалоге у меню апдейта не происходит сам, в отличие от мейнфрейма.&lt;br /&gt;
Для этого нужно сделать самим апдейт в обработчике сообщения WM_KICKIDLE.&lt;br /&gt;
Визардом обработчик не добавляется, поэтому можно переопределить виртуальную DefWindowProc() и там обработать:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;afxpriv.h&amp;gt;	//этот файл надо включить, там определёна WM_KICKIDLE&lt;br /&gt;
&lt;br /&gt;
LRESULT CMyDialog::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam) &lt;br /&gt;
{&lt;br /&gt;
	if(message==WM_KICKIDLE)&lt;br /&gt;
	{&lt;br /&gt;
		//делаем апдейт для всех пунктов меню&lt;br /&gt;
		CMenu* pMainMenu=GetMenu();&lt;br /&gt;
		if(pMainMenu)&lt;br /&gt;
		{&lt;br /&gt;
			CCmdUI cmdUI;&lt;br /&gt;
			for (UINT n=0; n &amp;lt; pMainMenu-&amp;gt;GetMenuItemCount(); ++n)&lt;br /&gt;
			{&lt;br /&gt;
				CMenu* pSubMenu = pMainMenu-&amp;gt;GetSubMenu(n);&lt;br /&gt;
				if(!pSubMenu)continue;&lt;br /&gt;
	&lt;br /&gt;
				cmdUI.m_nIndexMax = pSubMenu-&amp;gt;GetMenuItemCount();&lt;br /&gt;
				for (UINT i = 0; i &amp;lt; cmdUI.m_nIndexMax;++i)&lt;br /&gt;
				{&lt;br /&gt;
					cmdUI.m_nIndex = i;&lt;br /&gt;
					cmdUI.m_nID = pSubMenu-&amp;gt;GetMenuItemID(i);&lt;br /&gt;
					cmdUI.m_pMenu = pSubMenu;&lt;br /&gt;
					cmdUI.DoUpdate(this, FALSE);&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	return CDialog::DefWindowProc(message, wParam, lParam);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Как на Visual C++ 6.0 в Главном окне отключить системное меню (в левом верхнем углу) и кнопки(в правом верхнем углу) ?===&lt;br /&gt;
При создании окна нужно убрать стиль WS_SYSMENU&lt;br /&gt;
(теперь пользователь корректно может закрыть окно только Alt+F4  ,&lt;br /&gt;
ну или если вы предоставите ему дополнительную возможность сделать это )&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пример 1. (для SDI, MDI)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//этот обработчик уже добавлен визардом&lt;br /&gt;
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT&amp;amp; cs)&lt;br /&gt;
{&lt;br /&gt;
	if( !CFrameWnd::PreCreateWindow(cs) )&lt;br /&gt;
		return FALSE;&lt;br /&gt;
	// TODO: Modify the Window class or styles here by modifying&lt;br /&gt;
	//  the CREATESTRUCT cs&lt;br /&gt;
&lt;br /&gt;
	///////////////////////////////&lt;br /&gt;
	//добавленная часть&lt;br /&gt;
	{&lt;br /&gt;
		//убираем стиль&lt;br /&gt;
		cs.style&amp;amp;=~WS_SYSMENU;&lt;br /&gt;
	}&lt;br /&gt;
	///////////////////////////////&lt;br /&gt;
&lt;br /&gt;
	return TRUE;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Пример 2. (для диалога)&lt;br /&gt;
Если диалог описан в ресурсах, то в свойствах диалога убрать галочки&lt;br /&gt;
  &amp;quot;System menu&amp;quot;&lt;br /&gt;
  &amp;quot;Minimize box&amp;quot;&lt;br /&gt;
  &amp;quot;Maximize box&amp;quot;&lt;br /&gt;
===Хочу сделать так, чтобы пользователь не мог нажать на кнопку, пока программа не разрешит.===&lt;br /&gt;
Нужно применить метод класса CWnd::EnableWindow(...) для кнопки.&lt;br /&gt;
Значение параметра 0 делает кнопку неактивной, 1 - делает активной.&lt;br /&gt;
(кстати, не только для кнопки можно, а для любого класса, производного&lt;br /&gt;
от класса CWnd)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пример 1. Пусть имеется некий диалог, на нём лежит кнопка c ID == IDC_1.&lt;br /&gt;
в любом месте кода диалога (кроме конструктора и деструктора , хотя, если&lt;br /&gt;
проверить наличие валидного хендла диалога, как в примере, то ничего&lt;br /&gt;
страшного не будет и там)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//делаем кнопку неактивной&lt;br /&gt;
if(m_hWnd)&lt;br /&gt;
{&lt;br /&gt;
	CWnd* pw=0;&lt;br /&gt;
	pw=GetDlgItem(IDC_1);&lt;br /&gt;
	if(pw)pw-&amp;gt;EnableWindow(0);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Что означают сообщения, которые студия выводит при компиляции, вроде таких : Loaded 'C:\WINDOWS\SYSTEM\WSOCK32.DLL', no matching symbolic information found. ===&lt;br /&gt;
Это строка говорит о том, что студия не смогла найти отладочные&lt;br /&gt;
символы для WSOCK32.DLL. В этом нет ничего страшного, просто при наличии&lt;br /&gt;
отладочных символов в процессе отладки можно получить доступ к именам&lt;br /&gt;
функции из системных DLL. Например, вместо&lt;br /&gt;
 KERNEL32! 0x77E8B184() -&lt;br /&gt;
 увидим&lt;br /&gt;
 KERNEL32!CreateThread.&lt;br /&gt;
===Как обработать сообщения , которое приходит к некому контролу (скажем CEdit) ?===&lt;br /&gt;
Нужно произвести от CEdit свой класс, и в виртуальной процедуре класса WindowProc перехватить нужные сообщения.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
virtual LRESULT WindowProc(&lt;br /&gt;
   UINT message,&lt;br /&gt;
   WPARAM wParam,&lt;br /&gt;
   LPARAM lParam &lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Пример. Полностью выключаем, скажем, обработку сообщения WM_CHAR&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	LRESULT CMyEdit::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) &lt;br /&gt;
	{&lt;br /&gt;
		switch(message)&lt;br /&gt;
		{&lt;br /&gt;
			case WM_CHAR:&lt;br /&gt;
			{&lt;br /&gt;
				return 0;&lt;br /&gt;
			}&lt;br /&gt;
			break;&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		return CEdit::WindowProc(message, wParam, lParam);&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Чтобы связать экземпляр класса с контролом на форме, добавьте визардом для&lt;br /&gt;
контрола переменную класса (выбрав не Value а Control).&lt;br /&gt;
===Как настроить количество пробелов в табуляции?===&lt;br /&gt;
Tools-&amp;gt;Options-&amp;gt;Tabs-&amp;gt;Insert Spaces&lt;br /&gt;
(или  правой кнопкой мыши по тексту-&amp;gt; properties)&lt;br /&gt;
===Как автоматически расставить отступы?===&lt;br /&gt;
Выделить текст для форматирования, нажать Alt+F8&lt;br /&gt;
&lt;br /&gt;
Есть ещё программа Artistic Style, которая занимается&lt;br /&gt;
переформатированием кода&lt;br /&gt;
http://sourceforge.net/projects/astyle/&lt;br /&gt;
===Поиск границ блока===&lt;br /&gt;
&amp;quot;CTRL+ }&amp;quot; ищет парную фигурную скобку в тексте и переходит на неё&lt;br /&gt;
===Вертикальное выделение текста===&lt;br /&gt;
&amp;quot;Alt + выделение мышкой&amp;quot; - позволяет выделять вертикальные фрагменты текста&lt;br /&gt;
===Как узнать количество установленных в CListCtrl столбцов ?===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CListCtrl* pL=...; //указатель на переменную-контрол&lt;br /&gt;
&lt;br /&gt;
int count=pL-&amp;gt;GetHeaderCtrl()-&amp;gt;GetItemCount();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как получить иконку приложения?===&lt;br /&gt;
Если приложение запущено, то нужно найти его главное окно и&lt;br /&gt;
послать ему сообщение WM_GETICON.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//функция возвращант хендл иконки &lt;br /&gt;
LRESULT SendMessage(hWnd, WM_GETICON, wParam, 0);&lt;br /&gt;
&lt;br /&gt;
//hWnd == хендл окна приложения&lt;br /&gt;
//wParam == &lt;br /&gt;
//	1)==ICON_BIG - получить большую иконку&lt;br /&gt;
//	2)==ICON_SMALL - получить маленькую иконку&lt;br /&gt;
//	3)==ICON_SMALL2 - получить маленькую иконку, если она определена&lt;br /&gt;
//				в приложении. Если её нет, то маленькую иконку, &lt;br /&gt;
//				сгенерированную системой из большой иконки&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как в CString можно найти или вырезать часть строки?===&lt;br /&gt;
есть такие методы в CString :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//вырезает кусок строки&lt;br /&gt;
CString Mid(int nFirst) const;&lt;br /&gt;
CString Mid(int nFirst,  int nCount) const;&lt;br /&gt;
&lt;br /&gt;
//возвращает кусок строки (сначала или с конца)&lt;br /&gt;
CString Left(int nCount ) const;&lt;br /&gt;
CString Right(int nCount ) const;&lt;br /&gt;
&lt;br /&gt;
//возвращает начальный кусок строки, в котором есть только&lt;br /&gt;
//символы из набора,представленного в lpszCharSet&lt;br /&gt;
CString SpanIncluding(LPCTSTR lpszCharSet ) const;&lt;br /&gt;
&lt;br /&gt;
//возвращает начальный кусок строки, в котором нет&lt;br /&gt;
//символов из набора,представленного в lpszCharSet&lt;br /&gt;
CString SpanExcluding(LPCTSTR lpszCharSet ) const; &lt;br /&gt;
&lt;br /&gt;
//убирает &amp;quot;пробелоподобные&amp;quot; символы из самого начала строки&lt;br /&gt;
//(то есть - пробел, табуляцию (\t) , возврат каретки, перевод строки (/r/n))&lt;br /&gt;
void TrimLeft();&lt;br /&gt;
//убирает все повторы символа из самого начала строки&lt;br /&gt;
void TrimLeft(TCHAR chTarget );&lt;br /&gt;
//убирает из самого начала строки все символа из набора lpszTargets &lt;br /&gt;
void TrimLeft(LPCTSTR lpszTargets ); &lt;br /&gt;
&lt;br /&gt;
void TrimRight();&lt;br /&gt;
void TrimRight(TCHAR chTarget );&lt;br /&gt;
void TrimRight(LPCTSTR lpszTargets ); &lt;br /&gt;
&lt;br /&gt;
//поиск в строке&lt;br /&gt;
int Find( TCHAR ch ) const;&lt;br /&gt;
int Find( LPCTSTR lpszSub ) const;&lt;br /&gt;
int Find( TCHAR ch, int nStart ) const;&lt;br /&gt;
int Find( LPCTSTR pstr, int nStart ) const;&lt;br /&gt;
&lt;br /&gt;
//поиск, начиная с конца&lt;br /&gt;
int ReverseFind( TCHAR ch ) const;&lt;br /&gt;
&lt;br /&gt;
//поиск позиции первого символа, одного из набора,&lt;br /&gt;
// представленного в lpszCharSet&lt;br /&gt;
int FindOneOf( LPCTSTR lpszCharSet ) const;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Есть у меня CListBox и я в ходе выполнения программы добавляю в него строки. Но я не могу посмотреть что именно добавляется. Вывод результатов происходит в конце выполнения процедуры...===&lt;br /&gt;
Если нужно делать принудительную перерисовку окна во время&lt;br /&gt;
длительных вычислений, то нужно вызывать для окна, которое&lt;br /&gt;
надо перерисовать метод&lt;br /&gt;
  RedrawWindow()&lt;br /&gt;
с параметрами по умолчанию, или пару&lt;br /&gt;
  Invalidate(0);&lt;br /&gt;
  UpdateWindow();&lt;br /&gt;
Это приводит к пометке всего окна к перерисовке и отправлению&lt;br /&gt;
сообщения WM_PAINT в оконную процедуру в обход очереди&lt;br /&gt;
сообщений, вызывая немедленную перерисовку окна.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CWnd* pw=...;//окно , которое надо перерисовывать&lt;br /&gt;
&lt;br /&gt;
for(int i=0;i&amp;lt;10000)&lt;br /&gt;
{&lt;br /&gt;
	//меняется содержимое окна&lt;br /&gt;
	//...&lt;br /&gt;
&lt;br /&gt;
	//немедленная перерисовка&lt;br /&gt;
	pw-&amp;gt;Invalidate(0);&lt;br /&gt;
	pw-&amp;gt;UpdateWindow();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Я написал DLL , которую используют несколько приложений. Всё вроде работает, но когда происходит очередной вызов функции из DLL , почему то данные в функции обнуляются. С чем это связано ?===&lt;br /&gt;
Переменные и массивы в DLL, содержимое которых должно использоваться несколькими процессами, должны объявляться статическими. Статическая переменная или массив инициализируются только один раз в момент загрузки DLL.&lt;br /&gt;
Пример:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DWORD calltest()&lt;br /&gt;
{&lt;br /&gt;
	//будет выполнено только при первом вызове&lt;br /&gt;
	static DWORD callcount=0;&lt;br /&gt;
	static DWORD str[1000]={0}; &lt;br /&gt;
&lt;br /&gt;
	//будет выполняться каждый раз&lt;br /&gt;
	return ++callcount;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как открыть проекцию файла в память и как с ней работать?===&lt;br /&gt;
Как открыть проекцию файла в память и как с ней работать?&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HANDLE CreateFileMapping(&lt;br /&gt;
  HANDLE hFile,	//хендл уже открытого файла&lt;br /&gt;
  LPSECURITY_ATTRIBUTES lpAttributes,&lt;br /&gt;
  DWORD flProtect,	//способ открытия проекции&lt;br /&gt;
  DWORD dwMaximumSizeHigh,	//размер файла (старшие 4 байта , обычно==0)&lt;br /&gt;
  DWORD dwMaximumSizeLow,	//размер файла (младшие 4 байта)&lt;br /&gt;
  LPCTSTR lpName&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Доступ к созданной проекции производится процедурой&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LPVOID MapViewOfFile(&lt;br /&gt;
  HANDLE hFileMappingObject, //хендл проекции&lt;br /&gt;
  DWORD dwDesiredAccess,	//способ работы с проекцией&lt;br /&gt;
  DWORD dwFileOffsetHigh,&lt;br /&gt;
  DWORD dwFileOffsetLow, //смещение от начала файла (младшие 4 байта)&lt;br /&gt;
  SIZE_T dwNumberOfBytesToMap //длина в байтах (если ==0 - то весь файл)&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
далее с файлом можно работать как с обычным массивом в памяти.&lt;br /&gt;
&lt;br /&gt;
После работы с проекцией , её надо освободить процедурой&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
BOOL UnmapViewOfFile(&lt;br /&gt;
  LPCVOID lpBaseAddress //адрес, который вернула процедура MapViewOfFile&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Пример.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HANDLE hMapFile=0;//для проекции&lt;br /&gt;
&lt;br /&gt;
HANDLE hFile=...;//хендл уже открытого файла&lt;br /&gt;
DWORD dwdFileLen=...;//размер открытого файла&lt;br /&gt;
&lt;br /&gt;
//создаём проекцию &amp;quot;только для чтения&amp;quot;&lt;br /&gt;
hMapFile=::CreateFileMapping(hFile,0,PAGE_READONLY,0,dwdFileLen,0);&lt;br /&gt;
&lt;br /&gt;
//хендл hFile можно закрыть уже здесь, в принципе,&lt;br /&gt;
//но мы сделаем это позже&lt;br /&gt;
&lt;br /&gt;
//получаем доступ к проекции (тоже только для чтения)&lt;br /&gt;
BYTE* pbyFile=(BYTE*)::MapViewOfFile(hMapFile,FILE_MAP_READ,0,0,0);&lt;br /&gt;
&lt;br /&gt;
///////////////////&lt;br /&gt;
//тут работаем с массивом pbyFile[dwdFileLen] как с обычным,&lt;br /&gt;
//только не забываем, что он открыт только для чтения&lt;br /&gt;
//...&lt;br /&gt;
//...&lt;br /&gt;
//...&lt;br /&gt;
///////////////////&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//отключаем файл данных от адресного пространства&lt;br /&gt;
UnmapViewOfFile(pbyFile);&lt;br /&gt;
&lt;br /&gt;
//освобождаем хендл проекции&lt;br /&gt;
CloseHandle(hMapFile)&lt;br /&gt;
&lt;br /&gt;
//освобождаем хендл открытого файла&lt;br /&gt;
CloseHandle(hFile);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Использую MFC Grid control 2.25 , не получается отобразить картинку в ячейке. Как это делается ?===&lt;br /&gt;
Нужно создать список изображений (CImageList) , затем передать указатель на список в контрол. Поскольку контрол лишь копирует указатель , список должен создаваться динамически, либо быть членом класса, экземпляр которого существует всё время работы контрола.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 m_GridMarket&lt;br /&gt;
CImageList m_ImageList;&lt;br /&gt;
CGridCtrL m_Grid1&lt;br /&gt;
...&lt;br /&gt;
...&lt;br /&gt;
//неким образом создаётся список&lt;br /&gt;
m_ImageList.Create(...);&lt;br /&gt;
//...&lt;br /&gt;
&lt;br /&gt;
//вставляем в контрол&lt;br /&gt;
m_Grid1.SetImageList(&amp;amp;m_ImageList);&lt;br /&gt;
&lt;br /&gt;
//&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как при помощи IPicture отобразить картинку из файла? ===&lt;br /&gt;
Пример - несложная функция, отображающая картинку из файла&lt;br /&gt;
&lt;br /&gt;
поддерживаются форматы&lt;br /&gt;
BMP, GIF, JPEG, PNG, TIFF, EMF&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;quot;atlconv.h&amp;quot;&lt;br /&gt;
#define HandleIsValid(H) (H!=(HANDLE)-1 &amp;amp;&amp;amp; H!=(HANDLE)0)&lt;br /&gt;
&lt;br /&gt;
//*pDestDC - CDC, на который предполагается вывод картинки&lt;br /&gt;
//pchzFilePath - путь к файлу&lt;br /&gt;
//pWid - (возвращает) ширина картинки&lt;br /&gt;
//pHig - (возвращает) высота картинки&lt;br /&gt;
bool DrawBitmapFromFile(CDC* pDestDC,const char* pchzFilePath,int *pWid=0,int *pHig=0)&lt;br /&gt;
{&lt;br /&gt;
	bool result=false;&lt;br /&gt;
&lt;br /&gt;
	if(pWid)*pWid=0;&lt;br /&gt;
	if(pHig)*pHig=0;&lt;br /&gt;
&lt;br /&gt;
	int Wid=0;&lt;br /&gt;
	int Hig=0;&lt;br /&gt;
&lt;br /&gt;
	IPicture* pPic=0;&lt;br /&gt;
	try&lt;br /&gt;
	{&lt;br /&gt;
		IPicture* ptmpPic=0;&lt;br /&gt;
		USES_CONVERSION;&lt;br /&gt;
		HRESULT hr;&lt;br /&gt;
&lt;br /&gt;
		CString txt=pchzFilePath;&lt;br /&gt;
		hr= ::OleLoadPicturePath(&lt;br /&gt;
			const_cast&amp;lt;LPOLESTR&amp;gt;(T2COLE(txt)),&lt;br /&gt;
			0,0,0,IID_IPicture,&lt;br /&gt;
			reinterpret_cast&amp;lt;void **&amp;gt;(&amp;amp;ptmpPic)&lt;br /&gt;
			);&lt;br /&gt;
&lt;br /&gt;
		if(hr==S_OK &amp;amp;&amp;amp; ptmpPic)&lt;br /&gt;
		{&lt;br /&gt;
			pPic=ptmpPic;&lt;br /&gt;
		}&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			throw 0;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		OLE_XPOS_HIMETRIC cxSrc;&lt;br /&gt;
		OLE_YPOS_HIMETRIC cySrc;&lt;br /&gt;
&lt;br /&gt;
		if(S_OK!=pPic-&amp;gt;get_Width(&amp;amp;cxSrc))throw 0;&lt;br /&gt;
		if(S_OK!=pPic-&amp;gt;get_Height(&amp;amp;cySrc))throw 0;&lt;br /&gt;
&lt;br /&gt;
		Wid=cxSrc/26;&lt;br /&gt;
		Hig=cySrc/26;&lt;br /&gt;
&lt;br /&gt;
		//рисуем&lt;br /&gt;
		if(S_OK !=pPic-&amp;gt;Render(pDestDC-&amp;gt;GetSafeHdc(),&lt;br /&gt;
			0,Hig,Wid,-Hig,0,0,cxSrc,cySrc,0))throw 0;&lt;br /&gt;
	}&lt;br /&gt;
	catch(...)&lt;br /&gt;
	{&lt;br /&gt;
		result=false;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if(pPic)&lt;br /&gt;
	{&lt;br /&gt;
		pPic-&amp;gt;Release();&lt;br /&gt;
		pPic=0;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	if(pWid)*pWid=Wid;&lt;br /&gt;
	if(pHig)*pHig=Hig;&lt;br /&gt;
&lt;br /&gt;
	return result;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===У меня модальное диалоговое окно, в нем поле редактирования мультилайновое, т.е. чтобы перейти на новую строку надо нажать ентер, но вызывается стандартный обработчик диалогового окна. Подскажите, что делать?===&lt;br /&gt;
Нужно в редакторе ресурсов поставить для CEdit окошка галочку&lt;br /&gt;
свойства WantReturn,&lt;br /&gt;
&lt;br /&gt;
или добавить ES_WANTRETURN при создании CEdit контрола динамически.&lt;br /&gt;
===Как выводят картинку-логотип(splash screen) при запуске программы? То есть, когда загружается программа на экран выводится картинка, потом она исчезает(загрузка программы закончена) и пользователь может приступать к работе ===&lt;br /&gt;
Для этого используется класс, производный от CDialog. Этот диалог после создания показывает себя на экран, выводя на себя рисунок. Также запускает таймет, по срабатывани которого диалог гасится. Создаётся диалог InitInstance приложения.&lt;br /&gt;
&lt;br /&gt;
В VC6++ также есть уже готовый компонент&lt;br /&gt;
Project-&amp;gt;Add To Project -&amp;gt; Components and Controls-&amp;gt;(в папке &amp;quot;Visual C++ Components&amp;quot; есть SplashScreen.)&lt;br /&gt;
===Как сделать, чтобы при выпадении списка у ComboBox была не одна строка, а больше, вроде все свойства покрутил, не помогает Вместо выпадающего списка одна строка и скролл...===&lt;br /&gt;
В редакторе ресурсов надо щелкнуть в комбобоксе на треугольнике - появляется рамка для растягивания вниз - размер выпадающего списка.&lt;br /&gt;
===В VC++.net , что делать после того, как на форму установил ActiiveX ListView, как объявить класс и переменную для этого элемента?===&lt;br /&gt;
Щёлкнуть правой кнопкой мыши на элементе , в меню - add variable или add class&lt;br /&gt;
===Как вставить данные в буфер обмена (Clipboard) ? Как их оттуда вытащить ?===&lt;br /&gt;
&lt;br /&gt;
1) копирование в буфер обмена:&lt;br /&gt;
&lt;br /&gt;
  1.Готовим данные&lt;br /&gt;
    а.Выделяем память из кучи,  вызывая GlobalAlloc()&lt;br /&gt;
    б.Получаем указатель на выделенную память, вызывая GlobalLock()&lt;br /&gt;
    в.Заполняем данные&lt;br /&gt;
    г.Освобождаем указатель , вызывая GlobalUnlock();&lt;br /&gt;
&lt;br /&gt;
  2.Открываем буфер обмена , вызывая OpenClipboard();&lt;br /&gt;
  3.Очищаем буфер, вызывая EmptyClipboard();&lt;br /&gt;
  4.Вызываем SetClipboardData() один раз для каждого формата&lt;br /&gt;
      вставляемых данных (имеется в виду - если одни и те же&lt;br /&gt;
      данные представлены в разных форматах, и приложение&lt;br /&gt;
      может эти форматы создать)&lt;br /&gt;
  5.Закрываем буфер, вызывая CloseClipboard();&lt;br /&gt;
  6.ВЫЗЫВАТЬ GlobalFree() НЕ НУЖНО , в этом случае это&lt;br /&gt;
      предоставлено системе&lt;br /&gt;
&lt;br /&gt;
Скажем, хотим поместить в буфер обмена туда текст.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	//готовим данные&lt;br /&gt;
	//выделяем из кучи память для данных&lt;br /&gt;
	HANDLE hglbCopy = GlobalAlloc(GMEM_MOVEABLE,10);&lt;br /&gt;
	if(!hglbCopy)return;&lt;br /&gt;
&lt;br /&gt;
	//получаем указатель&lt;br /&gt;
	void* lpStr = GlobalLock(hglbCopy);&lt;br /&gt;
	if(!lpStr)return;&lt;br /&gt;
&lt;br /&gt;
	//заполняем данные&lt;br /&gt;
	strcpy((char*)lpStr,&amp;quot;my text&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	//освобождаем указатель&lt;br /&gt;
	GlobalUnlock(hglbCopy);&lt;br /&gt;
	lpStr=0;&lt;br /&gt;
&lt;br /&gt;
	//открываем буфер обмена&lt;br /&gt;
	OpenClipboard();&lt;br /&gt;
	//очищаем&lt;br /&gt;
	EmptyClipboard();&lt;br /&gt;
&lt;br /&gt;
	//текстовый формат&lt;br /&gt;
	SetClipboardData(CF_TEXT,hglbCopy);&lt;br /&gt;
&lt;br /&gt;
	//закрываем буфер&lt;br /&gt;
	CloseClipboard();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
2) извлечение из буфера обмена&lt;br /&gt;
&lt;br /&gt;
  1.Проверяем, что поддерживается нужный формат данных,&lt;br /&gt;
      вызывая IsClipboardFormatAvailable()&lt;br /&gt;
  2.Открываем буфер обмена , вызывая OpenClipboard();&lt;br /&gt;
  3.Достаём данные&lt;br /&gt;
   а.Получаем из буфера хендл требуемого формата,&lt;br /&gt;
      вызывая GetClipboardData()&lt;br /&gt;
    б.Получаем указатель на выделенную память, вызывая GlobalLock()&lt;br /&gt;
    в.Работаем с данными&lt;br /&gt;
    г.Освобождаем указатель , вызывая GlobalUnlock();&lt;br /&gt;
  4.Закрываем буфер, вызывая CloseClipboard();&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	//Проверяем, что поддерживается нужный формат данных,&lt;br /&gt;
	if(!IsClipboardFormatAvailable(CF_TEXT))return;&lt;br /&gt;
&lt;br /&gt;
	//открываем буфер обмена&lt;br /&gt;
	OpenClipboard();&lt;br /&gt;
&lt;br /&gt;
	//достаём данные&lt;br /&gt;
&lt;br /&gt;
	//текстовый формат&lt;br /&gt;
	HANDLE hglbCopy = GetClipboardData(CF_TEXT);&lt;br /&gt;
	if(!hglbCopy)return;&lt;br /&gt;
&lt;br /&gt;
	//получаем указатель&lt;br /&gt;
	void* lpStr = GlobalLock(hglbCopy);&lt;br /&gt;
	if(!lpStr)return;&lt;br /&gt;
&lt;br /&gt;
	//читаем данные&lt;br /&gt;
	char data[10];&lt;br /&gt;
	memmove(data,lpStr,sizeof(data));&lt;br /&gt;
&lt;br /&gt;
	//освобождаем указатель&lt;br /&gt;
	GlobalUnlock(hglbCopy);&lt;br /&gt;
	lpStr=0;&lt;br /&gt;
&lt;br /&gt;
	//закрываем буфер&lt;br /&gt;
	CloseClipboard();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как получить полный путь к экзешнику из самой программы ?===&lt;br /&gt;
В командную строку первым параметром система всегда передаёт заключённый в кавычки полный путь к файлу запущенной программы Достаём путь таким образом :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
BOOL CMyApp::InitInstance()&lt;br /&gt;
{&lt;br /&gt;
	//добыча полного имени экзешника&lt;br /&gt;
	CString csFullExeName;&lt;br /&gt;
	{&lt;br /&gt;
		CString csAppName=GetCommandLine();&lt;br /&gt;
		csAppName.Delete(0,1);&lt;br /&gt;
		csAppName.Replace('\&amp;quot;','\0');&lt;br /&gt;
		csFullExeName=(const char*)csAppName;&lt;br /&gt;
	}&lt;br /&gt;
	//теперь csFullExeName - содержит искомый путь&lt;br /&gt;
&lt;br /&gt;
	//...&lt;br /&gt;
	//...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Каким способом можно exe файл может заменить самого себя? То есть, моя программа обновляется, например, через Internet, и хочет обновить свой exe-файл. Но так как он в данный момент запущен - это будет, естественно, запрещено. Как это можно проще всего сделать?===&lt;br /&gt;
Один из способов - сделать копию экзешника и из него обновиться&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define def_exeNAMEup	&amp;quot;c:\\myprog_update.exe&amp;quot;&lt;br /&gt;
#define def_exeNAMEdnld	&amp;quot;c:\\myprog_downloaded.exe&amp;quot;&lt;br /&gt;
#define def_keyUdate	&amp;quot;/update&amp;quot;&lt;br /&gt;
&lt;br /&gt;
void CTESTFAQApp::UpdateItself()&lt;br /&gt;
{&lt;br /&gt;
	//добыча полного имени экзешника&lt;br /&gt;
	CString csFullExeName;&lt;br /&gt;
	{&lt;br /&gt;
		CString csAppName=GetCommandLine();&lt;br /&gt;
		csAppName.Delete(0,1);&lt;br /&gt;
		csAppName.Replace('\&amp;quot;','\0');&lt;br /&gt;
		csFullExeName=(const char*)csAppName;&lt;br /&gt;
	}&lt;br /&gt;
	//теперь csFullExeName - содержит искомый путь&lt;br /&gt;
&lt;br /&gt;
	//делаем копию экзешника с другим именем&lt;br /&gt;
	CopyFile(csFullExeName,def_exeNAMEup,0);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	//передаём в параметры нового процесса ключ и путь к текущему файлу&lt;br /&gt;
	CString csParams=def_keyUdate;&lt;br /&gt;
	csParams+=&amp;quot; &amp;quot;;&lt;br /&gt;
	csParams+=csFullExeName;&lt;br /&gt;
&lt;br /&gt;
	//запускаем копию&lt;br /&gt;
	STARTUPINFO si;&lt;br /&gt;
	PROCESS_INFORMATION pi;&lt;br /&gt;
	ZeroMemory(&amp;amp;si,sizeof(si));&lt;br /&gt;
	si.cb = sizeof(si);&lt;br /&gt;
	ZeroMemory(&amp;amp;pi,sizeof(pi));&lt;br /&gt;
	if(CreateProcess(def_exeNAMEup,def_keyUdate,0,0,0,0,0,0,&amp;amp;si,&amp;amp;pi))&lt;br /&gt;
	{&lt;br /&gt;
		//завершаем текущий процесс&lt;br /&gt;
		ExitFromMyApp();&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void CTESTFAQApp::ExitFromMyApp()&lt;br /&gt;
{&lt;br /&gt;
	exit(0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
BOOL CTESTFAQApp::InitInstance()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
	//смотрим, не запустили ли для апдейта?&lt;br /&gt;
&lt;br /&gt;
	CString txt;&lt;br /&gt;
	txt=m_lpCmdLine;&lt;br /&gt;
	if(txt.Find(def_keyUdate)==0)&lt;br /&gt;
	{&lt;br /&gt;
		//делаем айдейт&lt;br /&gt;
		txt.Replace(def_keyUdate,&amp;quot;&amp;quot;);&lt;br /&gt;
		txt.TrimLeft();&lt;br /&gt;
&lt;br /&gt;
		CString csFullExeName=txt;&lt;br /&gt;
&lt;br /&gt;
		//берём откуда то уже скачанный файл обновления&lt;br /&gt;
		//...&lt;br /&gt;
		CString csFull_Downloaded_ExeName=def_exeNAMEdnld;&lt;br /&gt;
&lt;br /&gt;
		//копируем файл (обновляем старый то есть)&lt;br /&gt;
		CopyFile(csFull_Downloaded_ExeName,csFullExeName,0);&lt;br /&gt;
&lt;br /&gt;
		//запускаем обновлённого мученника&lt;br /&gt;
		STARTUPINFO si;&lt;br /&gt;
		PROCESS_INFORMATION pi;&lt;br /&gt;
		ZeroMemory(&amp;amp;si,sizeof(si));&lt;br /&gt;
		si.cb = sizeof(si);&lt;br /&gt;
		ZeroMemory(&amp;amp;pi,sizeof(pi));&lt;br /&gt;
		if(CreateProcess(csFullExeName,0,0,0,0,0,0,0,&amp;amp;si,&amp;amp;pi))&lt;br /&gt;
&lt;br /&gt;
		ExitFromMyApp();&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
	//...&lt;br /&gt;
	//...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Есть строка символов (страничка из Инета) в кодировке utf-8 (строка char*). Как мне ее получить в формате String&lt;br /&gt;
или в char* в кодировке ANSI (cp 1251) ?===&lt;br /&gt;
Можно перевести строку из UTF8 в Unicode, затем из Unicode в 1251&lt;br /&gt;
&lt;br /&gt;
Ниже приведена структура, содержащая процедуры перекодирования,&lt;br /&gt;
а также процедуру с примером использования&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//описание структуры&lt;br /&gt;
struct coder&lt;br /&gt;
{&lt;br /&gt;
	//utf8-&amp;gt;unicode&lt;br /&gt;
	static wchar_t* utf8_to_unicode__dontForgetDeleteArr(const char *utf8_string)&lt;br /&gt;
	{&lt;br /&gt;
		wchar_t* pRes=0;&lt;br /&gt;
		int res_len=0;&lt;br /&gt;
&lt;br /&gt;
		//тест на возможность преобразования&lt;br /&gt;
		res_len=MultiByteToWideChar(CP_UTF8,0,utf8_string,-1,0,0);&lt;br /&gt;
		if(!res_len)return 0;&lt;br /&gt;
&lt;br /&gt;
		//выделяем память&lt;br /&gt;
		pRes = new wchar_t[res_len];&lt;br /&gt;
		if(!pRes)return 0;&lt;br /&gt;
&lt;br /&gt;
		//преобразование&lt;br /&gt;
		if(!MultiByteToWideChar(CP_UTF8,0,utf8_string,-1,pRes,res_len))&lt;br /&gt;
		{&lt;br /&gt;
			delete [] pRes;&lt;br /&gt;
			return 0;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		return pRes;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	//unicode-&amp;gt;1251&lt;br /&gt;
	static char * unicode_to_1251__dontForgetDeleteArr(const wchar_t *unicode_string)&lt;br /&gt;
	{&lt;br /&gt;
		char* pRes=0;&lt;br /&gt;
		int res_len=0;&lt;br /&gt;
&lt;br /&gt;
		//тест на возможность преобразования&lt;br /&gt;
		res_len = WideCharToMultiByte(1251,0,unicode_string,-1,0,0,0,0);&lt;br /&gt;
		if(!res_len)return 0;&lt;br /&gt;
&lt;br /&gt;
		//выделяем память&lt;br /&gt;
		pRes=new char[res_len];&lt;br /&gt;
		if(!pRes)return 0;&lt;br /&gt;
&lt;br /&gt;
		//преобразование&lt;br /&gt;
		if(!WideCharToMultiByte(1251,0,unicode_string,-1,pRes,res_len,0,0))&lt;br /&gt;
		{&lt;br /&gt;
			delete [] pRes;&lt;br /&gt;
			return 0;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		return pRes;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	//процедура с примером&lt;br /&gt;
	static void Example()&lt;br /&gt;
	{&lt;br /&gt;
		wchar_t* unicode_string=0;&lt;br /&gt;
		char* cp1251_string=0;&lt;br /&gt;
&lt;br /&gt;
		//исходный текст&lt;br /&gt;
		char utf8_string[] = &amp;quot;UTF-8 + СЂСѓСЃСЃРєРёР№ С‚РµРєСЃС‚&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
		for(;;)&lt;br /&gt;
		{&lt;br /&gt;
&lt;br /&gt;
			unicode_string=utf8_to_unicode__dontForgetDeleteArr(utf8_string);&lt;br /&gt;
			if(!unicode_string)&lt;br /&gt;
			{&lt;br /&gt;
				AfxMessageBox(&amp;quot;Не удалось конвертировать в unicode!&amp;quot;);&lt;br /&gt;
				break;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			cp1251_string = unicode_to_1251__dontForgetDeleteArr(unicode_string);&lt;br /&gt;
&lt;br /&gt;
			if(!cp1251_string)&lt;br /&gt;
			{&lt;br /&gt;
				AfxMessageBox(&amp;quot;Не удалось конвертировать из unicode!&amp;quot;);&lt;br /&gt;
				break;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			break;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		//cp1251_string - результат&lt;br /&gt;
		AfxMessageBox(cp1251_string);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
		//не забываем удалить массивы&lt;br /&gt;
		if(unicode_string)&lt;br /&gt;
		{&lt;br /&gt;
			delete [] unicode_string;&lt;br /&gt;
			unicode_string=0;&lt;br /&gt;
		}&lt;br /&gt;
		if(cp1251_string)&lt;br /&gt;
		{&lt;br /&gt;
			delete [] cp1251_string;&lt;br /&gt;
			cp1251_string=0;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
//вызов примера&lt;br /&gt;
coder::Example();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как организовать взаимодействие программы на VC.net с Access-овской базой данных?===&lt;br /&gt;
Проще всего подключить ADO компоненты и сделать все на них.&lt;br /&gt;
Компоненты  ADO (ADODC,DATAGRID и т.п.) это ActiveX.&lt;br /&gt;
В редакторе ресурсов, во всплывающем меню, есть Insert ActiveX Control -&amp;gt; открывается список всех компоент,&lt;br /&gt;
зарегистрированых на машине. Нужно найти компоненты (Это компоненты от MS и они помечены (OLEDB)) и вставить их в диалог. Для того что бы иметь возможность управлять ими, нужно импортировать обертки для них, это делается при помощи ClassWisard, там есть импорт-&amp;gt;класс-&amp;gt;указать файл с компоентой (OSX).&lt;br /&gt;
Появляется список всех классов, объявленых внутри.&lt;br /&gt;
Проставляем галочки, нажимаем ОК.&lt;br /&gt;
&lt;br /&gt;
[[Category:FAQ]]&lt;/div&gt;</summary>
		<author><name>Mczim</name></author>	</entry>

	<entry>
		<id>https://wiki.shelek.ru/index.php?title=FAQ:WinAPI,_VCPP_Part_3&amp;diff=404</id>
		<title>FAQ:WinAPI, VCPP Part 3</title>
		<link rel="alternate" type="text/html" href="https://wiki.shelek.ru/index.php?title=FAQ:WinAPI,_VCPP_Part_3&amp;diff=404"/>
				<updated>2008-08-14T18:30:30Z</updated>
		
		<summary type="html">&lt;p&gt;Mczim: пробел перед знаком вопроса в заголовке&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Имеется приложение на основе CRichEditView. Как узнать, что пользователь меняет текст?===&lt;br /&gt;
Добавить обработчик сообщения EN_CHANGE. Сообщение генерируется CRichEditView каждый раз, когда пользователь изменяет текст в окне CRichEditView&lt;br /&gt;
===Чем метод CArray::GetSize отличается от метода CArray::GetCount?===&lt;br /&gt;
Абсолютно ничем. (Скорее всего, были предыдущие библиотеки, в которых функции, одинаковые по смыслу, имели разные имена. Поэтому в целях совместимости оставили оба)&lt;br /&gt;
===Как загрузить строку из ресурса?===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CString m_Temp;&lt;br /&gt;
m_Temp.LoadString(ID_MYSTRING);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как поменять иконку у элемента (item) в CListCtrl?===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//заполняем структуру LVITEM&lt;br /&gt;
LVITEM lvItem;&lt;br /&gt;
memset(&amp;amp;lvItem,0,sizeof(lvItem));&lt;br /&gt;
	&lt;br /&gt;
lvItem.mask = LVIF_IMAGE;//меняться будет картинка&lt;br /&gt;
lvItem.iItem = ...;// индекс элемента списка (Zero-based)&lt;br /&gt;
lvItem.iSubItem = 0;&lt;br /&gt;
lvItem.iImage = ...; //индекс иконки (из списка контрола)&lt;br /&gt;
	&lt;br /&gt;
pList-&amp;gt;SetItem(&amp;amp; lvItem);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Имеется класс Class1, содержащий мембер типа указатель на Class2. В Class2 также имеется указатель на Class1. Компилятор выдаёт ошибку. Что надо делать?===&lt;br /&gt;
Предварительно объявляем класс Class2. Тогда компилятору будет известно, что описание класса Class2 будет встречено дальше, и станет возможным объявление указателей на класс до описания самого класса.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Class2;//предопределение&lt;br /&gt;
	&lt;br /&gt;
Class1&lt;br /&gt;
{&lt;br /&gt;
	Class2* p;&lt;br /&gt;
};&lt;br /&gt;
	&lt;br /&gt;
Class2&lt;br /&gt;
{&lt;br /&gt;
	Class1* p;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как переключить раскладку в другом (то есть в активном) процессе?===&lt;br /&gt;
Использовать функции:&lt;br /&gt;
   GetKeyboardLayout - определить текущую раскладку&lt;br /&gt;
   LoadKeyboardLayout - загрузить новую раскладку&lt;br /&gt;
&lt;br /&gt;
см.также&lt;br /&gt;
   VerLanguageName - получить строку с описанием языка&lt;br /&gt;
&lt;br /&gt;
(подробности - в MSDN)&lt;br /&gt;
===Как получить хендл контрола Edit зная его ID?===&lt;br /&gt;
Пусть контрол лежит на окне CMyWnd&lt;br /&gt;
Тогда:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void CMyWnd::некая_процедура()&lt;br /&gt;
{&lt;br /&gt;
	//для MFC&lt;br /&gt;
	CEdit* ed=(CEdit* ) GetDlgItem(ID_EDIT1);&lt;br /&gt;
	HWND hwnd=ed-&amp;gt;GetSafeHwnd();&lt;br /&gt;
	...&lt;br /&gt;
	&lt;br /&gt;
	//для Win32 API&lt;br /&gt;
	HWND hwnd=GetDlgItem(m_hWnd,ID_EDIT1);&lt;br /&gt;
	...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Как из дочернего окна закрыть приложение?===&lt;br /&gt;
Нужно послать родительскому окну (*pParent) сообщение WM_CLOSE:&lt;br /&gt;
 pParent-&amp;gt;PostMessage(WM_CLOSE);//MFC&lt;br /&gt;
или&lt;br /&gt;
 ::PostMessage(pParent-&amp;gt;m_hWnd,WM_CLOSE,(WPARAM)0,(LPARAM)0);//API&lt;br /&gt;
===Как корректно перевести BSTR в CString и наоборот?===&lt;br /&gt;
1) Нужно просто присвоить переменной типа CString переменную типа BSTR.&lt;br /&gt;
Оператор = класса CString сам всё переведёт.&lt;br /&gt;
&lt;br /&gt;
2)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//указатель на будущий буфер с BSTR.&lt;br /&gt;
//	(По сути, BSTR определён как &lt;br /&gt;
//	typedef WCHAR* BSTR;&lt;br /&gt;
//	то есть указатель на 16-битный символ юникод)&lt;br /&gt;
	&lt;br /&gt;
BSTR bstrHE=0;&lt;br /&gt;
	&lt;br /&gt;
CString Str=&amp;quot;мой текст&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
//Выделить память и загрузить адрес блока в bstrHE&lt;br /&gt;
bstrHE=Str.AllocSysString();&lt;br /&gt;
	&lt;br /&gt;
//...	&lt;br /&gt;
//тут работаем с bstrHE[]&lt;br /&gt;
//...&lt;br /&gt;
	&lt;br /&gt;
//освобождаем память&lt;br /&gt;
SysFreeString(bstrHE);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как получить доступ к графическим ресурсам элементов текущей темы оформления Windows?===&lt;br /&gt;
Использовать функции&lt;br /&gt;
&lt;br /&gt;
OpenThemeData()&lt;br /&gt;
DrawThemeBackground()&lt;br /&gt;
DrawFrameControl()&lt;br /&gt;
CloseThemeData().&lt;br /&gt;
&lt;br /&gt;
(подробности - в MSDN)&lt;br /&gt;
===Имеется класс , производный от CDialog. Когда диалог в фокусе, нажатие на Enter или Esc приводит к закрытию диалога. Как это запретить?===&lt;br /&gt;
При нажатии Enter происходит выполнение команды IDOK,&lt;br /&gt;
при нажатии Esc - IDCANCEL.&lt;br /&gt;
Нужно переопределить в классе виртуальные функции OnOk() и OnCancel(),&lt;br /&gt;
которые соответственно вызываются для этих команд. При помощи&lt;br /&gt;
визарда эти функции добавить можно так: Положить на диалог две кнопки&lt;br /&gt;
с идентификаторами IDOK и IDCANCEL (при создании нового диалога они там&lt;br /&gt;
есть сразу), затем двойной клик по кнопке добавляет соответствующий&lt;br /&gt;
обработчик. В обработчиках надо удалить вызовы СDialog::OnOK() и&lt;br /&gt;
CDialog::OnCancel(), тогда диалог закрываться не будет.&lt;br /&gt;
Однако тогда диалог станет невозможно закрыть кнопкой с крестиком  :)&lt;br /&gt;
&lt;br /&gt;
Лечить так: добавить обработчик сообщения WM_CLOSE - OnClose(), и в нём&lt;br /&gt;
сделать вызов OnOk() или OnCancel() :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void CPlayersPropsDialog::OnClose() &lt;br /&gt;
{&lt;br /&gt;
	CDialog::OnClose();&lt;br /&gt;
	CDialog::OnCancel();//добавлено&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===VC++6. Я написал простейший макрос, а компилятор на него ругается. ума не приложу, что за глюк?===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	#define my_macr(x,y,z) \&lt;br /&gt;
		z=\&lt;br /&gt;
		(x+y)*\&lt;br /&gt;
		(x-y)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Скорее всего после одного из символов соединения строк &amp;quot;\&amp;quot; имеется&lt;br /&gt;
пробел или табуляция. Их надо удалить. Можно найти их &amp;quot;наощупь&amp;quot;, а&lt;br /&gt;
можно включить показ непечатных символов в студии. Найти эту команду&lt;br /&gt;
можно так:&lt;br /&gt;
Tools-&amp;gt;Customize...-&amp;gt;вкладка Commands. , В окошке Category выбрать&lt;br /&gt;
&amp;quot;Edit&amp;quot;, и среди кнопок справа найти кнопку , на которой написано &amp;quot;a.b&amp;quot;&lt;br /&gt;
Эту кнопку надо перетащить на одну из панелей инструментов студии.&lt;br /&gt;
===Как получить список всех процесов, включая idle ?===&lt;br /&gt;
Использовать функции&lt;br /&gt;
Process32First()&lt;br /&gt;
Precess32Next()&lt;br /&gt;
===Как программно установить переменные окружения?===&lt;br /&gt;
Чтобы добавить или изменить их программно, необходимо воспользоваться&lt;br /&gt;
ключом реестра HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\&lt;br /&gt;
Session Manager\Environment, а затем отправить широковещательное&lt;br /&gt;
сообщение WM_SETTINGCHANGE. Это позволит приложениям узнать об&lt;br /&gt;
изменениях:&lt;br /&gt;
&lt;br /&gt;
::SendMessage(HWND_BROADCAST,WM_SETTINGCHANGE,0,0);&lt;br /&gt;
===Как сделать,чтобы у окна был черный фон?===&lt;br /&gt;
переопределить обработчик сообщения WM_CTLCOLOR - OnCtlColor() :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CBrush br(RGB(0,0,0));&lt;br /&gt;
	&lt;br /&gt;
HBRUSH CMyDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) &lt;br /&gt;
{&lt;br /&gt;
	HBRUSH hbr = CMyDlg::OnCtlColor(pDC, pWnd, nCtlColor);&lt;br /&gt;
	&lt;br /&gt;
	//фон диалога (или вьюшки)&lt;br /&gt;
	if(nCtlColor==CTLCOLOR_DLG)&lt;br /&gt;
	{&lt;br /&gt;
		return (HBRUSH)br;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	//фон статиков (если нужно)&lt;br /&gt;
	if(nCtlColor==CTLCOLOR_STATIC)&lt;br /&gt;
	{&lt;br /&gt;
		//делаем фон текста статика прозрачным&lt;br /&gt;
		pDC-&amp;gt;SetBkMode(TRANSPARENT);&lt;br /&gt;
		return (HBRUSH)br;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	return hbr;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Почему на моем компьютере экзешник, созданный в MFC запускается, а на других компьютерах - нет? Требует какую-то  dll-ку.===&lt;br /&gt;
Нужно выбирать режим Release :&lt;br /&gt;
&lt;br /&gt;
Menu-&amp;gt;Build-&amp;gt;Configurations...-&amp;gt;Release,&lt;br /&gt;
&lt;br /&gt;
и экзешник, соответственно, брать из папки Release проекта&lt;br /&gt;
===Как в диалог добавить меню?===&lt;br /&gt;
Надо сделать в ресурсах меню, затем вставить в диалог:&lt;br /&gt;
&lt;br /&gt;
открыть в редакторе диалог, в свойствах (во вкладке General, окошко Menu) указать идентивикатор ресурса меню.&lt;br /&gt;
При помощи визарда добавить для меню обработчики OnCommand() и OnUpdateСommand().&lt;br /&gt;
===Я добавил визардом меню в диалог. Добавил обработчики для пунктов меню. Но пункты работают, но OnUpdate для пунктов не вызывается - то есть не получается ни затенить, ни чек поставить. Что делать?===&lt;br /&gt;
В диалоге у меню апдейта не происходит сам, в отличие от мейнфрейма.&lt;br /&gt;
Для этого нужно сделать самим апдейт в обработчике сообщения WM_KICKIDLE.&lt;br /&gt;
Визардом обработчик не добавляется, поэтому можно переопределить виртуальную DefWindowProc() и там обработать:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;afxpriv.h&amp;gt;	//этот файл надо включить, там определёна WM_KICKIDLE&lt;br /&gt;
&lt;br /&gt;
LRESULT CMyDialog::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam) &lt;br /&gt;
{&lt;br /&gt;
	if(message==WM_KICKIDLE)&lt;br /&gt;
	{&lt;br /&gt;
		//делаем апдейт для всех пунктов меню&lt;br /&gt;
		CMenu* pMainMenu=GetMenu();&lt;br /&gt;
		if(pMainMenu)&lt;br /&gt;
		{&lt;br /&gt;
			CCmdUI cmdUI;&lt;br /&gt;
			for (UINT n=0; n &amp;lt; pMainMenu-&amp;gt;GetMenuItemCount(); ++n)&lt;br /&gt;
			{&lt;br /&gt;
				CMenu* pSubMenu = pMainMenu-&amp;gt;GetSubMenu(n);&lt;br /&gt;
				if(!pSubMenu)continue;&lt;br /&gt;
	&lt;br /&gt;
				cmdUI.m_nIndexMax = pSubMenu-&amp;gt;GetMenuItemCount();&lt;br /&gt;
				for (UINT i = 0; i &amp;lt; cmdUI.m_nIndexMax;++i)&lt;br /&gt;
				{&lt;br /&gt;
					cmdUI.m_nIndex = i;&lt;br /&gt;
					cmdUI.m_nID = pSubMenu-&amp;gt;GetMenuItemID(i);&lt;br /&gt;
					cmdUI.m_pMenu = pSubMenu;&lt;br /&gt;
					cmdUI.DoUpdate(this, FALSE);&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	return CDialog::DefWindowProc(message, wParam, lParam);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Как на Visual C++ 6.0 в Главном окне отключить системное меню (в левом верхнем углу) и кнопки(в правом верхнем углу) ?===&lt;br /&gt;
При создании окна нужно убрать стиль WS_SYSMENU&lt;br /&gt;
(теперь пользователь корректно может закрыть окно только Alt+F4  ,&lt;br /&gt;
ну или если вы предоставите ему дополнительную возможность сделать это )&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пример 1. (для SDI, MDI)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//этот обработчик уже добавлен визардом&lt;br /&gt;
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT&amp;amp; cs)&lt;br /&gt;
{&lt;br /&gt;
	if( !CFrameWnd::PreCreateWindow(cs) )&lt;br /&gt;
		return FALSE;&lt;br /&gt;
	// TODO: Modify the Window class or styles here by modifying&lt;br /&gt;
	//  the CREATESTRUCT cs&lt;br /&gt;
&lt;br /&gt;
	///////////////////////////////&lt;br /&gt;
	//добавленная часть&lt;br /&gt;
	{&lt;br /&gt;
		//убираем стиль&lt;br /&gt;
		cs.style&amp;amp;=~WS_SYSMENU;&lt;br /&gt;
	}&lt;br /&gt;
	///////////////////////////////&lt;br /&gt;
&lt;br /&gt;
	return TRUE;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Пример 2. (для диалога)&lt;br /&gt;
Если диалог описан в ресурсах, то в свойствах диалога убрать галочки&lt;br /&gt;
  &amp;quot;System menu&amp;quot;&lt;br /&gt;
  &amp;quot;Minimize box&amp;quot;&lt;br /&gt;
  &amp;quot;Maximize box&amp;quot;&lt;br /&gt;
===Хочу сделать так, чтобы пользователь не мог нажать на кнопку, пока программа не разрешит.===&lt;br /&gt;
Нужно применить метод класса CWnd::EnableWindow(...) для кнопки.&lt;br /&gt;
Значение параметра 0 делает кнопку неактивной, 1 - делает активной.&lt;br /&gt;
(кстати, не только для кнопки можно, а для любого класса, производного&lt;br /&gt;
от класса CWnd)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пример 1. Пусть имеется некий диалог, на нём лежит кнопка c ID == IDC_1.&lt;br /&gt;
в любом месте кода диалога (кроме конструктора и деструктора , хотя, если&lt;br /&gt;
проверить наличие валидного хендла диалога, как в примере, то ничего&lt;br /&gt;
страшного не будет и там)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//делаем кнопку неактивной&lt;br /&gt;
if(m_hWnd)&lt;br /&gt;
{&lt;br /&gt;
	CWnd* pw=0;&lt;br /&gt;
	pw=GetDlgItem(IDC_1);&lt;br /&gt;
	if(pw)pw-&amp;gt;EnableWindow(0);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Что означают сообщения, которые студия выводит при компиляции, вроде таких : Loaded 'C:\WINDOWS\SYSTEM\WSOCK32.DLL', no matching symbolic information found. ===&lt;br /&gt;
Это строка говорит о том, что студия не смогла найти отладочные&lt;br /&gt;
символы для WSOCK32.DLL. В этом нет ничего страшного, просто при наличии&lt;br /&gt;
отладочных символов в процессе отладки можно получить доступ к именам&lt;br /&gt;
функции из системных DLL. Например, вместо&lt;br /&gt;
 KERNEL32! 0x77E8B184() -&lt;br /&gt;
 увидим&lt;br /&gt;
 KERNEL32!CreateThread.&lt;br /&gt;
===Как обработать сообщения , которое приходит к некому контролу (скажем CEdit) ?===&lt;br /&gt;
Нужно произвести от CEdit свой класс, и в виртуальной процедуре класса WindowProc перехватить нужные сообщения.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
virtual LRESULT WindowProc(&lt;br /&gt;
   UINT message,&lt;br /&gt;
   WPARAM wParam,&lt;br /&gt;
   LPARAM lParam &lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Пример. Полностью выключаем, скажем, обработку сообщения WM_CHAR&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	LRESULT CMyEdit::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) &lt;br /&gt;
	{&lt;br /&gt;
		switch(message)&lt;br /&gt;
		{&lt;br /&gt;
			case WM_CHAR:&lt;br /&gt;
			{&lt;br /&gt;
				return 0;&lt;br /&gt;
			}&lt;br /&gt;
			break;&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		return CEdit::WindowProc(message, wParam, lParam);&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Чтобы связать экземпляр класса с контролом на форме, добавьте визардом для&lt;br /&gt;
контрола переменную класса (выбрав не Value а Control).&lt;br /&gt;
===Как настроить количество пробелов в табуляции?===&lt;br /&gt;
Tools-&amp;gt;Options-&amp;gt;Tabs-&amp;gt;Insert Spaces&lt;br /&gt;
(или  правой кнопкой мыши по тексту-&amp;gt; properties)&lt;br /&gt;
===Как автоматически расставить отступы?===&lt;br /&gt;
Выделить текст для форматирования, нажать Alt+F8&lt;br /&gt;
&lt;br /&gt;
Есть ещё программа Artistic Style, которая занимается&lt;br /&gt;
переформатированием кода&lt;br /&gt;
http://sourceforge.net/projects/astyle/&lt;br /&gt;
===Поиск границ блока===&lt;br /&gt;
&amp;quot;CTRL+ }&amp;quot; ищет парную фигурную скобку в тексте и переходит на неё&lt;br /&gt;
===Вертикальное выделение текста===&lt;br /&gt;
&amp;quot;Alt + выделение мышкой&amp;quot; - позволяет выделять вертикальные фрагменты текста&lt;br /&gt;
===Как узнать количество установленных в CListCtrl столбцов ?===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CListCtrl* pL=...; //указатель на переменную-контрол&lt;br /&gt;
&lt;br /&gt;
int count=pL-&amp;gt;GetHeaderCtrl()-&amp;gt;GetItemCount();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как получить иконку приложения?===&lt;br /&gt;
Если приложение запущено, то нужно найти его главное окно и&lt;br /&gt;
послать ему сообщение WM_GETICON.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//функция возвращант хендл иконки &lt;br /&gt;
LRESULT SendMessage(hWnd, WM_GETICON, wParam, 0);&lt;br /&gt;
&lt;br /&gt;
//hWnd == хендл окна приложения&lt;br /&gt;
//wParam == &lt;br /&gt;
//	1)==ICON_BIG - получить большую иконку&lt;br /&gt;
//	2)==ICON_SMALL - получить маленькую иконку&lt;br /&gt;
//	3)==ICON_SMALL2 - получить маленькую иконку, если она определена&lt;br /&gt;
//				в приложении. Если её нет, то маленькую иконку, &lt;br /&gt;
//				сгенерированную системой из большой иконки&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как в CString можно найти или вырезать часть строки?===&lt;br /&gt;
есть такие методы в CString :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//вырезает кусок строки&lt;br /&gt;
CString Mid(int nFirst) const;&lt;br /&gt;
CString Mid(int nFirst,  int nCount) const;&lt;br /&gt;
&lt;br /&gt;
//возвращает кусок строки (сначала или с конца)&lt;br /&gt;
CString Left(int nCount ) const;&lt;br /&gt;
CString Right(int nCount ) const;&lt;br /&gt;
&lt;br /&gt;
//возвращает начальный кусок строки, в котором есть только&lt;br /&gt;
//символы из набора,представленного в lpszCharSet&lt;br /&gt;
CString SpanIncluding(LPCTSTR lpszCharSet ) const;&lt;br /&gt;
&lt;br /&gt;
//возвращает начальный кусок строки, в котором нет&lt;br /&gt;
//символов из набора,представленного в lpszCharSet&lt;br /&gt;
CString SpanExcluding(LPCTSTR lpszCharSet ) const; &lt;br /&gt;
&lt;br /&gt;
//убирает &amp;quot;пробелоподобные&amp;quot; символы из самого начала строки&lt;br /&gt;
//(то есть - пробел, табуляцию (\t) , возврат каретки, перевод строки (/r/n))&lt;br /&gt;
void TrimLeft();&lt;br /&gt;
//убирает все повторы символа из самого начала строки&lt;br /&gt;
void TrimLeft(TCHAR chTarget );&lt;br /&gt;
//убирает из самого начала строки все символа из набора lpszTargets &lt;br /&gt;
void TrimLeft(LPCTSTR lpszTargets ); &lt;br /&gt;
&lt;br /&gt;
void TrimRight();&lt;br /&gt;
void TrimRight(TCHAR chTarget );&lt;br /&gt;
void TrimRight(LPCTSTR lpszTargets ); &lt;br /&gt;
&lt;br /&gt;
//поиск в строке&lt;br /&gt;
int Find( TCHAR ch ) const;&lt;br /&gt;
int Find( LPCTSTR lpszSub ) const;&lt;br /&gt;
int Find( TCHAR ch, int nStart ) const;&lt;br /&gt;
int Find( LPCTSTR pstr, int nStart ) const;&lt;br /&gt;
&lt;br /&gt;
//поиск, начиная с конца&lt;br /&gt;
int ReverseFind( TCHAR ch ) const;&lt;br /&gt;
&lt;br /&gt;
//поиск позиции первого символа, одного из набора,&lt;br /&gt;
// представленного в lpszCharSet&lt;br /&gt;
int FindOneOf( LPCTSTR lpszCharSet ) const;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Есть у меня CListBox и я в ходе выполнения программы добавляю в него строки. Но я не могу посмотреть что именно добавляется. Вывод результатов происходит в конце выполнения процедуры...===&lt;br /&gt;
Если нужно делать принудительную перерисовку окна во время&lt;br /&gt;
длительных вычислений, то нужно вызывать для окна, которое&lt;br /&gt;
надо перерисовать метод&lt;br /&gt;
  RedrawWindow()&lt;br /&gt;
с параметрами по умолчанию, или пару&lt;br /&gt;
  Invalidate(0);&lt;br /&gt;
  UpdateWindow();&lt;br /&gt;
Это приводит к пометке всего окна к перерисовке и отправлению&lt;br /&gt;
сообщения WM_PAINT в оконную процедуру в обход очереди&lt;br /&gt;
сообщений, вызывая немедленную перерисовку окна.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CWnd* pw=...;//окно , которое надо перерисовывать&lt;br /&gt;
&lt;br /&gt;
for(int i=0;i&amp;lt;10000)&lt;br /&gt;
{&lt;br /&gt;
	//меняется содержимое окна&lt;br /&gt;
	//...&lt;br /&gt;
&lt;br /&gt;
	//немедленная перерисовка&lt;br /&gt;
	pw-&amp;gt;Invalidate(0);&lt;br /&gt;
	pw-&amp;gt;UpdateWindow();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Я написал DLL , которую используют несколько приложений. Всё вроде работает, но когда происходит очередной вызов функции из DLL , почему то данные в функции обнуляются. С чем это связано ?===&lt;br /&gt;
Переменные и массивы в DLL, содержимое которых должно использоваться несколькими процессами, должны объявляться статическими. Статическая переменная или массив инициализируются только один раз в момент загрузки DLL.&lt;br /&gt;
Пример:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DWORD calltest()&lt;br /&gt;
{&lt;br /&gt;
	//будет выполнено только при первом вызове&lt;br /&gt;
	static DWORD callcount=0;&lt;br /&gt;
	static DWORD str[1000]={0}; &lt;br /&gt;
&lt;br /&gt;
	//будет выполняться каждый раз&lt;br /&gt;
	return ++callcount;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как открыть проекцию файла в память и как с ней работать?===&lt;br /&gt;
Как открыть проекцию файла в память и как с ней работать?&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HANDLE CreateFileMapping(&lt;br /&gt;
  HANDLE hFile,	//хендл уже открытого файла&lt;br /&gt;
  LPSECURITY_ATTRIBUTES lpAttributes,&lt;br /&gt;
  DWORD flProtect,	//способ открытия проекции&lt;br /&gt;
  DWORD dwMaximumSizeHigh,	//размер файла (старшие 4 байта , обычно==0)&lt;br /&gt;
  DWORD dwMaximumSizeLow,	//размер файла (младшие 4 байта)&lt;br /&gt;
  LPCTSTR lpName&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Доступ к созданной проекции производится процедурой&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LPVOID MapViewOfFile(&lt;br /&gt;
  HANDLE hFileMappingObject, //хендл проекции&lt;br /&gt;
  DWORD dwDesiredAccess,	//способ работы с проекцией&lt;br /&gt;
  DWORD dwFileOffsetHigh,&lt;br /&gt;
  DWORD dwFileOffsetLow, //смещение от начала файла (младшие 4 байта)&lt;br /&gt;
  SIZE_T dwNumberOfBytesToMap //длина в байтах (если ==0 - то весь файл)&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
далее с файлом можно работать как с обычным массивом в памяти.&lt;br /&gt;
&lt;br /&gt;
После работы с проекцией , её надо освободить процедурой&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
BOOL UnmapViewOfFile(&lt;br /&gt;
  LPCVOID lpBaseAddress //адрес, который вернула процедура MapViewOfFile&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Пример.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HANDLE hMapFile=0;//для проекции&lt;br /&gt;
&lt;br /&gt;
HANDLE hFile=...;//хендл уже открытого файла&lt;br /&gt;
DWORD dwdFileLen=...;//размер открытого файла&lt;br /&gt;
&lt;br /&gt;
//создаём проекцию &amp;quot;только для чтения&amp;quot;&lt;br /&gt;
hMapFile=::CreateFileMapping(hFile,0,PAGE_READONLY,0,dwdFileLen,0);&lt;br /&gt;
&lt;br /&gt;
//хендл hFile можно закрыть уже здесь, в принципе,&lt;br /&gt;
//но мы сделаем это позже&lt;br /&gt;
&lt;br /&gt;
//получаем доступ к проекции (тоже только для чтения)&lt;br /&gt;
BYTE* pbyFile=(BYTE*)::MapViewOfFile(hMapFile,FILE_MAP_READ,0,0,0);&lt;br /&gt;
&lt;br /&gt;
///////////////////&lt;br /&gt;
//тут работаем с массивом pbyFile[dwdFileLen] как с обычным,&lt;br /&gt;
//только не забываем, что он открыт только для чтения&lt;br /&gt;
//...&lt;br /&gt;
//...&lt;br /&gt;
//...&lt;br /&gt;
///////////////////&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//отключаем файл данных от адресного пространства&lt;br /&gt;
UnmapViewOfFile(pbyFile);&lt;br /&gt;
&lt;br /&gt;
//освобождаем хендл проекции&lt;br /&gt;
CloseHandle(hMapFile)&lt;br /&gt;
&lt;br /&gt;
//освобождаем хендл открытого файла&lt;br /&gt;
CloseHandle(hFile);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Использую MFC Grid control 2.25 , не получается отобразить картинку в ячейке. Как это делается ?===&lt;br /&gt;
Нужно создать список изображений (CImageList) , затем передать указатель на список в контрол. Поскольку контрол лишь копирует указатель , список должен создаваться динамически, либо быть членом класса, экземпляр которого существует всё время работы контрола.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 m_GridMarket&lt;br /&gt;
CImageList m_ImageList;&lt;br /&gt;
CGridCtrL m_Grid1&lt;br /&gt;
...&lt;br /&gt;
...&lt;br /&gt;
//неким образом создаётся список&lt;br /&gt;
m_ImageList.Create(...);&lt;br /&gt;
//...&lt;br /&gt;
&lt;br /&gt;
//вставляем в контрол&lt;br /&gt;
m_Grid1.SetImageList(&amp;amp;m_ImageList);&lt;br /&gt;
&lt;br /&gt;
//&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как при помощи IPicture отобразить картинку из файла? ===&lt;br /&gt;
Пример - несложная функция, отображающая картинку из файла&lt;br /&gt;
&lt;br /&gt;
поддерживаются форматы&lt;br /&gt;
BMP, GIF, JPEG, PNG, TIFF, EMF&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;quot;atlconv.h&amp;quot;&lt;br /&gt;
#define HandleIsValid(H) (H!=(HANDLE)-1 &amp;amp;&amp;amp; H!=(HANDLE)0)&lt;br /&gt;
&lt;br /&gt;
//*pDestDC - CDC, на который предполагается вывод картинки&lt;br /&gt;
//pchzFilePath - путь к файлу&lt;br /&gt;
//pWid - (возвращает) ширина картинки&lt;br /&gt;
//pHig - (возвращает) высота картинки&lt;br /&gt;
bool DrawBitmapFromFile(CDC* pDestDC,const char* pchzFilePath,int *pWid=0,int *pHig=0)&lt;br /&gt;
{&lt;br /&gt;
	bool result=false;&lt;br /&gt;
&lt;br /&gt;
	if(pWid)*pWid=0;&lt;br /&gt;
	if(pHig)*pHig=0;&lt;br /&gt;
&lt;br /&gt;
	int Wid=0;&lt;br /&gt;
	int Hig=0;&lt;br /&gt;
&lt;br /&gt;
	IPicture* pPic=0;&lt;br /&gt;
	try&lt;br /&gt;
	{&lt;br /&gt;
		IPicture* ptmpPic=0;&lt;br /&gt;
		USES_CONVERSION;&lt;br /&gt;
		HRESULT hr;&lt;br /&gt;
&lt;br /&gt;
		CString txt=pchzFilePath;&lt;br /&gt;
		hr= ::OleLoadPicturePath(&lt;br /&gt;
			const_cast&amp;lt;LPOLESTR&amp;gt;(T2COLE(txt)),&lt;br /&gt;
			0,0,0,IID_IPicture,&lt;br /&gt;
			reinterpret_cast&amp;lt;void **&amp;gt;(&amp;amp;ptmpPic)&lt;br /&gt;
			);&lt;br /&gt;
&lt;br /&gt;
		if(hr==S_OK &amp;amp;&amp;amp; ptmpPic)&lt;br /&gt;
		{&lt;br /&gt;
			pPic=ptmpPic;&lt;br /&gt;
		}&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			throw 0;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		OLE_XPOS_HIMETRIC cxSrc;&lt;br /&gt;
		OLE_YPOS_HIMETRIC cySrc;&lt;br /&gt;
&lt;br /&gt;
		if(S_OK!=pPic-&amp;gt;get_Width(&amp;amp;cxSrc))throw 0;&lt;br /&gt;
		if(S_OK!=pPic-&amp;gt;get_Height(&amp;amp;cySrc))throw 0;&lt;br /&gt;
&lt;br /&gt;
		Wid=cxSrc/26;&lt;br /&gt;
		Hig=cySrc/26;&lt;br /&gt;
&lt;br /&gt;
		//рисуем&lt;br /&gt;
		if(S_OK !=pPic-&amp;gt;Render(pDestDC-&amp;gt;GetSafeHdc(),&lt;br /&gt;
			0,Hig,Wid,-Hig,0,0,cxSrc,cySrc,0))throw 0;&lt;br /&gt;
	}&lt;br /&gt;
	catch(...)&lt;br /&gt;
	{&lt;br /&gt;
		result=false;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if(pPic)&lt;br /&gt;
	{&lt;br /&gt;
		pPic-&amp;gt;Release();&lt;br /&gt;
		pPic=0;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	if(pWid)*pWid=Wid;&lt;br /&gt;
	if(pHig)*pHig=Hig;&lt;br /&gt;
&lt;br /&gt;
	return result;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===У меня модальное диалоговое окно, в нем поле редактирования мультилайновое, т.е. чтобы перейти на новую строку надо нажать ентер, но вызывается стандартный обработчик диалогового окна. Подскажите, что делать?===&lt;br /&gt;
Нужно в редакторе ресурсов поставить для CEdit окошка галочку&lt;br /&gt;
свойства WantReturn,&lt;br /&gt;
&lt;br /&gt;
или добавить ES_WANTRETURN при создании CEdit контрола динамически.&lt;br /&gt;
===Как выводят картинку-логотип(splash screen) при запуске программы? То есть, когда загружается программа на экран выводится картинка, потом она исчезает(загрузка программы закончена) и пользователь может приступать к работе ===&lt;br /&gt;
Для этого используется класс, производный от CDialog. Этот диалог после создания показывает себя на экран, выводя на себя рисунок. Также запускает таймет, по срабатывани которого диалог гасится. Создаётся диалог InitInstance приложения.&lt;br /&gt;
&lt;br /&gt;
В VC6++ также есть уже готовый компонент&lt;br /&gt;
Project-&amp;gt;Add To Project -&amp;gt; Components and Controls-&amp;gt;(в папке &amp;quot;Visual C++ Components&amp;quot; есть SplashScreen.)&lt;br /&gt;
===Как сделать, чтобы при выпадении списка у ComboBox была не одна строка, а больше, вроде все свойства покрутил, не помогает Вместо выпадающего списка одна строка и скролл...===&lt;br /&gt;
В редакторе ресурсов надо щелкнуть в комбобоксе на треугольнике - появляется рамка для растягивания вниз - размер выпадающего списка.&lt;br /&gt;
===В VC++.net , что делать после того, как на форму установил ActiiveX ListView, как объявить класс и переменную для этого элемента?===&lt;br /&gt;
Щёлкнуть правой кнопкой мыши на элементе , в меню - add variable или add class&lt;br /&gt;
===Как вставить данные в буфер обмена (Clipboard) ? Как их оттуда вытащить ?===&lt;br /&gt;
&lt;br /&gt;
1) копирование в буфер обмена:&lt;br /&gt;
&lt;br /&gt;
  1.Готовим данные&lt;br /&gt;
    а.Выделяем память из кучи,  вызывая GlobalAlloc()&lt;br /&gt;
    б.Получаем указатель на выделенную память, вызывая GlobalLock()&lt;br /&gt;
    в.Заполняем данные&lt;br /&gt;
    г.Освобождаем указатель , вызывая GlobalUnlock();&lt;br /&gt;
&lt;br /&gt;
  2.Открываем буфер обмена , вызывая OpenClipboard();&lt;br /&gt;
  3.Очищаем буфер, вызывая EmptyClipboard();&lt;br /&gt;
  4.Вызываем SetClipboardData() один раз для каждого формата&lt;br /&gt;
      вставляемых данных (имеется в виду - если одни и те же&lt;br /&gt;
      данные представлены в разных форматах, и приложение&lt;br /&gt;
      может эти форматы создать)&lt;br /&gt;
  5.Закрываем буфер, вызывая CloseClipboard();&lt;br /&gt;
  6.ВЫЗЫВАТЬ GlobalFree() НЕ НУЖНО , в этом случае это&lt;br /&gt;
      предоставлено системе&lt;br /&gt;
&lt;br /&gt;
Скажем, хотим поместить в буфер обмена туда текст.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	//готовим данные&lt;br /&gt;
	//выделяем из кучи память для данных&lt;br /&gt;
	HANDLE hglbCopy = GlobalAlloc(GMEM_MOVEABLE,10);&lt;br /&gt;
	if(!hglbCopy)return;&lt;br /&gt;
&lt;br /&gt;
	//получаем указатель&lt;br /&gt;
	void* lpStr = GlobalLock(hglbCopy);&lt;br /&gt;
	if(!lpStr)return;&lt;br /&gt;
&lt;br /&gt;
	//заполняем данные&lt;br /&gt;
	strcpy((char*)lpStr,&amp;quot;my text&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	//освобождаем указатель&lt;br /&gt;
	GlobalUnlock(hglbCopy);&lt;br /&gt;
	lpStr=0;&lt;br /&gt;
&lt;br /&gt;
	//открываем буфер обмена&lt;br /&gt;
	OpenClipboard();&lt;br /&gt;
	//очищаем&lt;br /&gt;
	EmptyClipboard();&lt;br /&gt;
&lt;br /&gt;
	//текстовый формат&lt;br /&gt;
	SetClipboardData(CF_TEXT,hglbCopy);&lt;br /&gt;
&lt;br /&gt;
	//закрываем буфер&lt;br /&gt;
	CloseClipboard();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
2) извлечение из буфера обмена&lt;br /&gt;
&lt;br /&gt;
  1.Проверяем, что поддерживается нужный формат данных,&lt;br /&gt;
      вызывая IsClipboardFormatAvailable()&lt;br /&gt;
  2.Открываем буфер обмена , вызывая OpenClipboard();&lt;br /&gt;
  3.Достаём данные&lt;br /&gt;
   а.Получаем из буфера хендл требуемого формата,&lt;br /&gt;
      вызывая GetClipboardData()&lt;br /&gt;
    б.Получаем указатель на выделенную память, вызывая GlobalLock()&lt;br /&gt;
    в.Работаем с данными&lt;br /&gt;
    г.Освобождаем указатель , вызывая GlobalUnlock();&lt;br /&gt;
  4.Закрываем буфер, вызывая CloseClipboard();&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	//Проверяем, что поддерживается нужный формат данных,&lt;br /&gt;
	if(!IsClipboardFormatAvailable(CF_TEXT))return;&lt;br /&gt;
&lt;br /&gt;
	//открываем буфер обмена&lt;br /&gt;
	OpenClipboard();&lt;br /&gt;
&lt;br /&gt;
	//достаём данные&lt;br /&gt;
&lt;br /&gt;
	//текстовый формат&lt;br /&gt;
	HANDLE hglbCopy = GetClipboardData(CF_TEXT);&lt;br /&gt;
	if(!hglbCopy)return;&lt;br /&gt;
&lt;br /&gt;
	//получаем указатель&lt;br /&gt;
	void* lpStr = GlobalLock(hglbCopy);&lt;br /&gt;
	if(!lpStr)return;&lt;br /&gt;
&lt;br /&gt;
	//читаем данные&lt;br /&gt;
	char data[10];&lt;br /&gt;
	memmove(data,lpStr,sizeof(data));&lt;br /&gt;
&lt;br /&gt;
	//освобождаем указатель&lt;br /&gt;
	GlobalUnlock(hglbCopy);&lt;br /&gt;
	lpStr=0;&lt;br /&gt;
&lt;br /&gt;
	//закрываем буфер&lt;br /&gt;
	CloseClipboard();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как получить полный путь к экзешнику из самой программы ?===&lt;br /&gt;
В командную строку первым параметром система всегда передаёт заключённый в кавычки полный путь к файлу запущенной программы Достаём путь таким образом :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
BOOL CMyApp::InitInstance()&lt;br /&gt;
{&lt;br /&gt;
	//добыча полного имени экзешника&lt;br /&gt;
	CString csFullExeName;&lt;br /&gt;
	{&lt;br /&gt;
		CString csAppName=GetCommandLine();&lt;br /&gt;
		csAppName.Delete(0,1);&lt;br /&gt;
		csAppName.Replace('\&amp;quot;','\0');&lt;br /&gt;
		csFullExeName=(const char*)csAppName;&lt;br /&gt;
	}&lt;br /&gt;
	//теперь csFullExeName - содержит искомый путь&lt;br /&gt;
&lt;br /&gt;
	//...&lt;br /&gt;
	//...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Каким способом можно exe файл может заменить самого себя? То есть, моя программа обновляется, например, через Internet, и хочет обновить свой exe-файл. Но так как он в данный момент запущен - это будет, естественно, запрещено. Как это можно проще всего сделать?===&lt;br /&gt;
Один из способов - сделать копию экзешника и из него обновиться&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define def_exeNAMEup	&amp;quot;c:\\myprog_update.exe&amp;quot;&lt;br /&gt;
#define def_exeNAMEdnld	&amp;quot;c:\\myprog_downloaded.exe&amp;quot;&lt;br /&gt;
#define def_keyUdate	&amp;quot;/update&amp;quot;&lt;br /&gt;
&lt;br /&gt;
void CTESTFAQApp::UpdateItself()&lt;br /&gt;
{&lt;br /&gt;
	//добыча полного имени экзешника&lt;br /&gt;
	CString csFullExeName;&lt;br /&gt;
	{&lt;br /&gt;
		CString csAppName=GetCommandLine();&lt;br /&gt;
		csAppName.Delete(0,1);&lt;br /&gt;
		csAppName.Replace('\&amp;quot;','\0');&lt;br /&gt;
		csFullExeName=(const char*)csAppName;&lt;br /&gt;
	}&lt;br /&gt;
	//теперь csFullExeName - содержит искомый путь&lt;br /&gt;
&lt;br /&gt;
	//делаем копию экзешника с другим именем&lt;br /&gt;
	CopyFile(csFullExeName,def_exeNAMEup,0);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	//передаём в параметры нового процесса ключ и путь к текущему файлу&lt;br /&gt;
	CString csParams=def_keyUdate;&lt;br /&gt;
	csParams+=&amp;quot; &amp;quot;;&lt;br /&gt;
	csParams+=csFullExeName;&lt;br /&gt;
&lt;br /&gt;
	//запускаем копию&lt;br /&gt;
	STARTUPINFO si;&lt;br /&gt;
	PROCESS_INFORMATION pi;&lt;br /&gt;
	ZeroMemory(&amp;amp;si,sizeof(si));&lt;br /&gt;
	si.cb = sizeof(si);&lt;br /&gt;
	ZeroMemory(&amp;amp;pi,sizeof(pi));&lt;br /&gt;
	if(CreateProcess(def_exeNAMEup,def_keyUdate,0,0,0,0,0,0,&amp;amp;si,&amp;amp;pi))&lt;br /&gt;
	{&lt;br /&gt;
		//завершаем текущий процесс&lt;br /&gt;
		ExitFromMyApp();&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void CTESTFAQApp::ExitFromMyApp()&lt;br /&gt;
{&lt;br /&gt;
	exit(0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
BOOL CTESTFAQApp::InitInstance()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
	//смотрим, не запустили ли для апдейта?&lt;br /&gt;
&lt;br /&gt;
	CString txt;&lt;br /&gt;
	txt=m_lpCmdLine;&lt;br /&gt;
	if(txt.Find(def_keyUdate)==0)&lt;br /&gt;
	{&lt;br /&gt;
		//делаем айдейт&lt;br /&gt;
		txt.Replace(def_keyUdate,&amp;quot;&amp;quot;);&lt;br /&gt;
		txt.TrimLeft();&lt;br /&gt;
&lt;br /&gt;
		CString csFullExeName=txt;&lt;br /&gt;
&lt;br /&gt;
		//берём откуда то уже скачанный файл обновления&lt;br /&gt;
		//...&lt;br /&gt;
		CString csFull_Downloaded_ExeName=def_exeNAMEdnld;&lt;br /&gt;
&lt;br /&gt;
		//копируем файл (обновляем старый то есть)&lt;br /&gt;
		CopyFile(csFull_Downloaded_ExeName,csFullExeName,0);&lt;br /&gt;
&lt;br /&gt;
		//запускаем обновлённого мученника&lt;br /&gt;
		STARTUPINFO si;&lt;br /&gt;
		PROCESS_INFORMATION pi;&lt;br /&gt;
		ZeroMemory(&amp;amp;si,sizeof(si));&lt;br /&gt;
		si.cb = sizeof(si);&lt;br /&gt;
		ZeroMemory(&amp;amp;pi,sizeof(pi));&lt;br /&gt;
		if(CreateProcess(csFullExeName,0,0,0,0,0,0,0,&amp;amp;si,&amp;amp;pi))&lt;br /&gt;
&lt;br /&gt;
		ExitFromMyApp();&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
	//...&lt;br /&gt;
	//...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Есть строка символов (страничка из Инета) в кодировке utf-8 (строка char*). Как мне ее получить в формате String&lt;br /&gt;
или в char* в кодировке ANSI (cp 1251) ?===&lt;br /&gt;
Можно перевести строку из UTF8 в Unicode, затем из Unicode в 1251&lt;br /&gt;
&lt;br /&gt;
Ниже приведена структура, содержащая процедуры перекодирования,&lt;br /&gt;
а также процедуру с примером использования&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//описание структуры&lt;br /&gt;
struct coder&lt;br /&gt;
{&lt;br /&gt;
	//utf8-&amp;gt;unicode&lt;br /&gt;
	static wchar_t* utf8_to_unicode__dontForgetDeleteArr(const char *utf8_string)&lt;br /&gt;
	{&lt;br /&gt;
		wchar_t* pRes=0;&lt;br /&gt;
		int res_len=0;&lt;br /&gt;
&lt;br /&gt;
		//тест на возможность преобразования&lt;br /&gt;
		res_len=MultiByteToWideChar(CP_UTF8,0,utf8_string,-1,0,0);&lt;br /&gt;
		if(!res_len)return 0;&lt;br /&gt;
&lt;br /&gt;
		//выделяем память&lt;br /&gt;
		pRes = new wchar_t[res_len];&lt;br /&gt;
		if(!pRes)return 0;&lt;br /&gt;
&lt;br /&gt;
		//преобразование&lt;br /&gt;
		if(!MultiByteToWideChar(CP_UTF8,0,utf8_string,-1,pRes,res_len))&lt;br /&gt;
		{&lt;br /&gt;
			delete [] pRes;&lt;br /&gt;
			return 0;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		return pRes;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	//unicode-&amp;gt;1251&lt;br /&gt;
	static char * unicode_to_1251__dontForgetDeleteArr(const wchar_t *unicode_string)&lt;br /&gt;
	{&lt;br /&gt;
		char* pRes=0;&lt;br /&gt;
		int res_len=0;&lt;br /&gt;
&lt;br /&gt;
		//тест на возможность преобразования&lt;br /&gt;
		res_len = WideCharToMultiByte(1251,0,unicode_string,-1,0,0,0,0);&lt;br /&gt;
		if(!res_len)return 0;&lt;br /&gt;
&lt;br /&gt;
		//выделяем память&lt;br /&gt;
		pRes=new char[res_len];&lt;br /&gt;
		if(!pRes)return 0;&lt;br /&gt;
&lt;br /&gt;
		//преобразование&lt;br /&gt;
		if(!WideCharToMultiByte(1251,0,unicode_string,-1,pRes,res_len,0,0))&lt;br /&gt;
		{&lt;br /&gt;
			delete [] pRes;&lt;br /&gt;
			return 0;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		return pRes;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	//процедура с примером&lt;br /&gt;
	static void Example()&lt;br /&gt;
	{&lt;br /&gt;
		wchar_t* unicode_string=0;&lt;br /&gt;
		char* cp1251_string=0;&lt;br /&gt;
&lt;br /&gt;
		//исходный текст&lt;br /&gt;
		char utf8_string[] = &amp;quot;UTF-8 + СЂСѓСЃСЃРєРёР№ С‚РµРєСЃС‚&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
		for(;;)&lt;br /&gt;
		{&lt;br /&gt;
&lt;br /&gt;
			unicode_string=utf8_to_unicode__dontForgetDeleteArr(utf8_string);&lt;br /&gt;
			if(!unicode_string)&lt;br /&gt;
			{&lt;br /&gt;
				AfxMessageBox(&amp;quot;Не удалось конвертировать в unicode!&amp;quot;);&lt;br /&gt;
				break;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			cp1251_string = unicode_to_1251__dontForgetDeleteArr(unicode_string);&lt;br /&gt;
&lt;br /&gt;
			if(!cp1251_string)&lt;br /&gt;
			{&lt;br /&gt;
				AfxMessageBox(&amp;quot;Не удалось конвертировать из unicode!&amp;quot;);&lt;br /&gt;
				break;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			break;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		//cp1251_string - результат&lt;br /&gt;
		AfxMessageBox(cp1251_string);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
		//не забываем удалить массивы&lt;br /&gt;
		if(unicode_string)&lt;br /&gt;
		{&lt;br /&gt;
			delete [] unicode_string;&lt;br /&gt;
			unicode_string=0;&lt;br /&gt;
		}&lt;br /&gt;
		if(cp1251_string)&lt;br /&gt;
		{&lt;br /&gt;
			delete [] cp1251_string;&lt;br /&gt;
			cp1251_string=0;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
//вызов примера&lt;br /&gt;
coder::Example();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как организовать взаимодействие программы на VC.net с Access-овской базой данных?===&lt;br /&gt;
Проще всего подключить ADO компоненты и сделать все на них.&lt;br /&gt;
Компоненты  ADO (ADODC,DATAGRID и т.п.) это ActiveX.&lt;br /&gt;
В редакторе ресурсов, во всплывающем меню, есть Insert ActiveX Control -&amp;gt; открывается список всех компоент,&lt;br /&gt;
зарегистрированых на машине. Нужно найти компоненты (Это компоненты от MS и они помечены (OLEDB)) и вставить их в диалог. Для того что бы иметь возможность управлять ими, нужно импортировать обертки для них, это делается при помощи ClassWisard, там есть импорт-&amp;gt;класс-&amp;gt;указать файл с компоентой (OSX).&lt;br /&gt;
Появляется список всех классов, объявленых внутри.&lt;br /&gt;
Проставляем галочки, нажимаем ОК.&lt;br /&gt;
&lt;br /&gt;
[[Category:FAQ]]&lt;/div&gt;</summary>
		<author><name>Mczim</name></author>	</entry>

	<entry>
		<id>https://wiki.shelek.ru/index.php?title=FAQ:WinAPI,_VCPP_Part_3&amp;diff=403</id>
		<title>FAQ:WinAPI, VCPP Part 3</title>
		<link rel="alternate" type="text/html" href="https://wiki.shelek.ru/index.php?title=FAQ:WinAPI,_VCPP_Part_3&amp;diff=403"/>
				<updated>2008-08-14T18:29:18Z</updated>
		
		<summary type="html">&lt;p&gt;Mczim: пробел перед знаком вопроса в заголовке&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Имеется приложение на основе CRichEditView. Как узнать, что пользователь меняет текст?===&lt;br /&gt;
Добавить обработчик сообщения EN_CHANGE. Сообщение генерируется CRichEditView каждый раз, когда пользователь изменяет текст в окне CRichEditView&lt;br /&gt;
===Чем метод CArray::GetSize отличается от метода CArray::GetCount?===&lt;br /&gt;
Абсолютно ничем. (Скорее всего, были предыдущие библиотеки, в которых функции, одинаковые по смыслу, имели разные имена. Поэтому в целях совместимости оставили оба)&lt;br /&gt;
===Как загрузить строку из ресурса?===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CString m_Temp;&lt;br /&gt;
m_Temp.LoadString(ID_MYSTRING);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как поменять иконку у элемента (item) в CListCtrl?===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//заполняем структуру LVITEM&lt;br /&gt;
LVITEM lvItem;&lt;br /&gt;
memset(&amp;amp;lvItem,0,sizeof(lvItem));&lt;br /&gt;
	&lt;br /&gt;
lvItem.mask = LVIF_IMAGE;//меняться будет картинка&lt;br /&gt;
lvItem.iItem = ...;// индекс элемента списка (Zero-based)&lt;br /&gt;
lvItem.iSubItem = 0;&lt;br /&gt;
lvItem.iImage = ...; //индекс иконки (из списка контрола)&lt;br /&gt;
	&lt;br /&gt;
pList-&amp;gt;SetItem(&amp;amp; lvItem);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Имеется класс Class1, содержащий мембер типа указатель на Class2. В Class2 также имеется указатель на Class1. Компилятор выдаёт ошибку. Что надо делать?===&lt;br /&gt;
Предварительно объявляем класс Class2. Тогда компилятору будет известно, что описание класса Class2 будет встречено дальше, и станет возможным объявление указателей на класс до описания самого класса.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Class2;//предопределение&lt;br /&gt;
	&lt;br /&gt;
Class1&lt;br /&gt;
{&lt;br /&gt;
	Class2* p;&lt;br /&gt;
};&lt;br /&gt;
	&lt;br /&gt;
Class2&lt;br /&gt;
{&lt;br /&gt;
	Class1* p;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как переключить раскладку в другом (то есть в активном) процессе?===&lt;br /&gt;
Использовать функции:&lt;br /&gt;
   GetKeyboardLayout - определить текущую раскладку&lt;br /&gt;
   LoadKeyboardLayout - загрузить новую раскладку&lt;br /&gt;
&lt;br /&gt;
см.также&lt;br /&gt;
   VerLanguageName - получить строку с описанием языка&lt;br /&gt;
&lt;br /&gt;
(подробности - в MSDN)&lt;br /&gt;
===Как получить хендл контрола Edit зная его ID ?===&lt;br /&gt;
Пусть контрол лежит на окне CMyWnd&lt;br /&gt;
Тогда:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void CMyWnd::некая_процедура()&lt;br /&gt;
{&lt;br /&gt;
	//для MFC&lt;br /&gt;
	CEdit* ed=(CEdit* ) GetDlgItem(ID_EDIT1);&lt;br /&gt;
	HWND hwnd=ed-&amp;gt;GetSafeHwnd();&lt;br /&gt;
	...&lt;br /&gt;
	&lt;br /&gt;
	//для Win32 API&lt;br /&gt;
	HWND hwnd=GetDlgItem(m_hWnd,ID_EDIT1);&lt;br /&gt;
	...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как из дочернего окна закрыть приложение?===&lt;br /&gt;
Нужно послать родительскому окну (*pParent) сообщение WM_CLOSE:&lt;br /&gt;
 pParent-&amp;gt;PostMessage(WM_CLOSE);//MFC&lt;br /&gt;
или&lt;br /&gt;
 ::PostMessage(pParent-&amp;gt;m_hWnd,WM_CLOSE,(WPARAM)0,(LPARAM)0);//API&lt;br /&gt;
===Как корректно перевести BSTR в CString и наоборот?===&lt;br /&gt;
1) Нужно просто присвоить переменной типа CString переменную типа BSTR.&lt;br /&gt;
Оператор = класса CString сам всё переведёт.&lt;br /&gt;
&lt;br /&gt;
2)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//указатель на будущий буфер с BSTR.&lt;br /&gt;
//	(По сути, BSTR определён как &lt;br /&gt;
//	typedef WCHAR* BSTR;&lt;br /&gt;
//	то есть указатель на 16-битный символ юникод)&lt;br /&gt;
	&lt;br /&gt;
BSTR bstrHE=0;&lt;br /&gt;
	&lt;br /&gt;
CString Str=&amp;quot;мой текст&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
//Выделить память и загрузить адрес блока в bstrHE&lt;br /&gt;
bstrHE=Str.AllocSysString();&lt;br /&gt;
	&lt;br /&gt;
//...	&lt;br /&gt;
//тут работаем с bstrHE[]&lt;br /&gt;
//...&lt;br /&gt;
	&lt;br /&gt;
//освобождаем память&lt;br /&gt;
SysFreeString(bstrHE);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как получить доступ к графическим ресурсам элементов текущей темы оформления Windows?===&lt;br /&gt;
Использовать функции&lt;br /&gt;
&lt;br /&gt;
OpenThemeData()&lt;br /&gt;
DrawThemeBackground()&lt;br /&gt;
DrawFrameControl()&lt;br /&gt;
CloseThemeData().&lt;br /&gt;
&lt;br /&gt;
(подробности - в MSDN)&lt;br /&gt;
===Имеется класс , производный от CDialog. Когда диалог в фокусе, нажатие на Enter или Esc приводит к закрытию диалога. Как это запретить?===&lt;br /&gt;
При нажатии Enter происходит выполнение команды IDOK,&lt;br /&gt;
при нажатии Esc - IDCANCEL.&lt;br /&gt;
Нужно переопределить в классе виртуальные функции OnOk() и OnCancel(),&lt;br /&gt;
которые соответственно вызываются для этих команд. При помощи&lt;br /&gt;
визарда эти функции добавить можно так: Положить на диалог две кнопки&lt;br /&gt;
с идентификаторами IDOK и IDCANCEL (при создании нового диалога они там&lt;br /&gt;
есть сразу), затем двойной клик по кнопке добавляет соответствующий&lt;br /&gt;
обработчик. В обработчиках надо удалить вызовы СDialog::OnOK() и&lt;br /&gt;
CDialog::OnCancel(), тогда диалог закрываться не будет.&lt;br /&gt;
Однако тогда диалог станет невозможно закрыть кнопкой с крестиком  :)&lt;br /&gt;
&lt;br /&gt;
Лечить так: добавить обработчик сообщения WM_CLOSE - OnClose(), и в нём&lt;br /&gt;
сделать вызов OnOk() или OnCancel() :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void CPlayersPropsDialog::OnClose() &lt;br /&gt;
{&lt;br /&gt;
	CDialog::OnClose();&lt;br /&gt;
	CDialog::OnCancel();//добавлено&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===VC++6. Я написал простейший макрос, а компилятор на него ругается. ума не приложу, что за глюк?===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	#define my_macr(x,y,z) \&lt;br /&gt;
		z=\&lt;br /&gt;
		(x+y)*\&lt;br /&gt;
		(x-y)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Скорее всего после одного из символов соединения строк &amp;quot;\&amp;quot; имеется&lt;br /&gt;
пробел или табуляция. Их надо удалить. Можно найти их &amp;quot;наощупь&amp;quot;, а&lt;br /&gt;
можно включить показ непечатных символов в студии. Найти эту команду&lt;br /&gt;
можно так:&lt;br /&gt;
Tools-&amp;gt;Customize...-&amp;gt;вкладка Commands. , В окошке Category выбрать&lt;br /&gt;
&amp;quot;Edit&amp;quot;, и среди кнопок справа найти кнопку , на которой написано &amp;quot;a.b&amp;quot;&lt;br /&gt;
Эту кнопку надо перетащить на одну из панелей инструментов студии.&lt;br /&gt;
===Как получить список всех процесов, включая idle ?===&lt;br /&gt;
Использовать функции&lt;br /&gt;
Process32First()&lt;br /&gt;
Precess32Next()&lt;br /&gt;
===Как программно установить переменные окружения?===&lt;br /&gt;
Чтобы добавить или изменить их программно, необходимо воспользоваться&lt;br /&gt;
ключом реестра HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\&lt;br /&gt;
Session Manager\Environment, а затем отправить широковещательное&lt;br /&gt;
сообщение WM_SETTINGCHANGE. Это позволит приложениям узнать об&lt;br /&gt;
изменениях:&lt;br /&gt;
&lt;br /&gt;
::SendMessage(HWND_BROADCAST,WM_SETTINGCHANGE,0,0);&lt;br /&gt;
===Как сделать,чтобы у окна был черный фон?===&lt;br /&gt;
переопределить обработчик сообщения WM_CTLCOLOR - OnCtlColor() :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CBrush br(RGB(0,0,0));&lt;br /&gt;
	&lt;br /&gt;
HBRUSH CMyDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) &lt;br /&gt;
{&lt;br /&gt;
	HBRUSH hbr = CMyDlg::OnCtlColor(pDC, pWnd, nCtlColor);&lt;br /&gt;
	&lt;br /&gt;
	//фон диалога (или вьюшки)&lt;br /&gt;
	if(nCtlColor==CTLCOLOR_DLG)&lt;br /&gt;
	{&lt;br /&gt;
		return (HBRUSH)br;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	//фон статиков (если нужно)&lt;br /&gt;
	if(nCtlColor==CTLCOLOR_STATIC)&lt;br /&gt;
	{&lt;br /&gt;
		//делаем фон текста статика прозрачным&lt;br /&gt;
		pDC-&amp;gt;SetBkMode(TRANSPARENT);&lt;br /&gt;
		return (HBRUSH)br;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	return hbr;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Почему на моем компьютере экзешник, созданный в MFC запускается, а на других компьютерах - нет? Требует какую-то  dll-ку.===&lt;br /&gt;
Нужно выбирать режим Release :&lt;br /&gt;
&lt;br /&gt;
Menu-&amp;gt;Build-&amp;gt;Configurations...-&amp;gt;Release,&lt;br /&gt;
&lt;br /&gt;
и экзешник, соответственно, брать из папки Release проекта&lt;br /&gt;
===Как в диалог добавить меню?===&lt;br /&gt;
Надо сделать в ресурсах меню, затем вставить в диалог:&lt;br /&gt;
&lt;br /&gt;
открыть в редакторе диалог, в свойствах (во вкладке General, окошко Menu) указать идентивикатор ресурса меню.&lt;br /&gt;
При помощи визарда добавить для меню обработчики OnCommand() и OnUpdateСommand().&lt;br /&gt;
===Я добавил визардом меню в диалог. Добавил обработчики для пунктов меню. Но пункты работают, но OnUpdate для пунктов не вызывается - то есть не получается ни затенить, ни чек поставить. Что делать?===&lt;br /&gt;
В диалоге у меню апдейта не происходит сам, в отличие от мейнфрейма.&lt;br /&gt;
Для этого нужно сделать самим апдейт в обработчике сообщения WM_KICKIDLE.&lt;br /&gt;
Визардом обработчик не добавляется, поэтому можно переопределить виртуальную DefWindowProc() и там обработать:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;afxpriv.h&amp;gt;	//этот файл надо включить, там определёна WM_KICKIDLE&lt;br /&gt;
&lt;br /&gt;
LRESULT CMyDialog::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam) &lt;br /&gt;
{&lt;br /&gt;
	if(message==WM_KICKIDLE)&lt;br /&gt;
	{&lt;br /&gt;
		//делаем апдейт для всех пунктов меню&lt;br /&gt;
		CMenu* pMainMenu=GetMenu();&lt;br /&gt;
		if(pMainMenu)&lt;br /&gt;
		{&lt;br /&gt;
			CCmdUI cmdUI;&lt;br /&gt;
			for (UINT n=0; n &amp;lt; pMainMenu-&amp;gt;GetMenuItemCount(); ++n)&lt;br /&gt;
			{&lt;br /&gt;
				CMenu* pSubMenu = pMainMenu-&amp;gt;GetSubMenu(n);&lt;br /&gt;
				if(!pSubMenu)continue;&lt;br /&gt;
	&lt;br /&gt;
				cmdUI.m_nIndexMax = pSubMenu-&amp;gt;GetMenuItemCount();&lt;br /&gt;
				for (UINT i = 0; i &amp;lt; cmdUI.m_nIndexMax;++i)&lt;br /&gt;
				{&lt;br /&gt;
					cmdUI.m_nIndex = i;&lt;br /&gt;
					cmdUI.m_nID = pSubMenu-&amp;gt;GetMenuItemID(i);&lt;br /&gt;
					cmdUI.m_pMenu = pSubMenu;&lt;br /&gt;
					cmdUI.DoUpdate(this, FALSE);&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	return CDialog::DefWindowProc(message, wParam, lParam);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Как на Visual C++ 6.0 в Главном окне отключить системное меню (в левом верхнем углу) и кнопки(в правом верхнем углу) ?===&lt;br /&gt;
При создании окна нужно убрать стиль WS_SYSMENU&lt;br /&gt;
(теперь пользователь корректно может закрыть окно только Alt+F4  ,&lt;br /&gt;
ну или если вы предоставите ему дополнительную возможность сделать это )&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пример 1. (для SDI, MDI)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//этот обработчик уже добавлен визардом&lt;br /&gt;
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT&amp;amp; cs)&lt;br /&gt;
{&lt;br /&gt;
	if( !CFrameWnd::PreCreateWindow(cs) )&lt;br /&gt;
		return FALSE;&lt;br /&gt;
	// TODO: Modify the Window class or styles here by modifying&lt;br /&gt;
	//  the CREATESTRUCT cs&lt;br /&gt;
&lt;br /&gt;
	///////////////////////////////&lt;br /&gt;
	//добавленная часть&lt;br /&gt;
	{&lt;br /&gt;
		//убираем стиль&lt;br /&gt;
		cs.style&amp;amp;=~WS_SYSMENU;&lt;br /&gt;
	}&lt;br /&gt;
	///////////////////////////////&lt;br /&gt;
&lt;br /&gt;
	return TRUE;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Пример 2. (для диалога)&lt;br /&gt;
Если диалог описан в ресурсах, то в свойствах диалога убрать галочки&lt;br /&gt;
  &amp;quot;System menu&amp;quot;&lt;br /&gt;
  &amp;quot;Minimize box&amp;quot;&lt;br /&gt;
  &amp;quot;Maximize box&amp;quot;&lt;br /&gt;
===Хочу сделать так, чтобы пользователь не мог нажать на кнопку, пока программа не разрешит.===&lt;br /&gt;
Нужно применить метод класса CWnd::EnableWindow(...) для кнопки.&lt;br /&gt;
Значение параметра 0 делает кнопку неактивной, 1 - делает активной.&lt;br /&gt;
(кстати, не только для кнопки можно, а для любого класса, производного&lt;br /&gt;
от класса CWnd)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пример 1. Пусть имеется некий диалог, на нём лежит кнопка c ID == IDC_1.&lt;br /&gt;
в любом месте кода диалога (кроме конструктора и деструктора , хотя, если&lt;br /&gt;
проверить наличие валидного хендла диалога, как в примере, то ничего&lt;br /&gt;
страшного не будет и там)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//делаем кнопку неактивной&lt;br /&gt;
if(m_hWnd)&lt;br /&gt;
{&lt;br /&gt;
	CWnd* pw=0;&lt;br /&gt;
	pw=GetDlgItem(IDC_1);&lt;br /&gt;
	if(pw)pw-&amp;gt;EnableWindow(0);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Что означают сообщения, которые студия выводит при компиляции, вроде таких : Loaded 'C:\WINDOWS\SYSTEM\WSOCK32.DLL', no matching symbolic information found. ===&lt;br /&gt;
Это строка говорит о том, что студия не смогла найти отладочные&lt;br /&gt;
символы для WSOCK32.DLL. В этом нет ничего страшного, просто при наличии&lt;br /&gt;
отладочных символов в процессе отладки можно получить доступ к именам&lt;br /&gt;
функции из системных DLL. Например, вместо&lt;br /&gt;
 KERNEL32! 0x77E8B184() -&lt;br /&gt;
 увидим&lt;br /&gt;
 KERNEL32!CreateThread.&lt;br /&gt;
===Как обработать сообщения , которое приходит к некому контролу (скажем CEdit) ?===&lt;br /&gt;
Нужно произвести от CEdit свой класс, и в виртуальной процедуре класса WindowProc перехватить нужные сообщения.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
virtual LRESULT WindowProc(&lt;br /&gt;
   UINT message,&lt;br /&gt;
   WPARAM wParam,&lt;br /&gt;
   LPARAM lParam &lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Пример. Полностью выключаем, скажем, обработку сообщения WM_CHAR&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	LRESULT CMyEdit::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) &lt;br /&gt;
	{&lt;br /&gt;
		switch(message)&lt;br /&gt;
		{&lt;br /&gt;
			case WM_CHAR:&lt;br /&gt;
			{&lt;br /&gt;
				return 0;&lt;br /&gt;
			}&lt;br /&gt;
			break;&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		return CEdit::WindowProc(message, wParam, lParam);&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Чтобы связать экземпляр класса с контролом на форме, добавьте визардом для&lt;br /&gt;
контрола переменную класса (выбрав не Value а Control).&lt;br /&gt;
===Как настроить количество пробелов в табуляции?===&lt;br /&gt;
Tools-&amp;gt;Options-&amp;gt;Tabs-&amp;gt;Insert Spaces&lt;br /&gt;
(или  правой кнопкой мыши по тексту-&amp;gt; properties)&lt;br /&gt;
===Как автоматически расставить отступы?===&lt;br /&gt;
Выделить текст для форматирования, нажать Alt+F8&lt;br /&gt;
&lt;br /&gt;
Есть ещё программа Artistic Style, которая занимается&lt;br /&gt;
переформатированием кода&lt;br /&gt;
http://sourceforge.net/projects/astyle/&lt;br /&gt;
===Поиск границ блока===&lt;br /&gt;
&amp;quot;CTRL+ }&amp;quot; ищет парную фигурную скобку в тексте и переходит на неё&lt;br /&gt;
===Вертикальное выделение текста===&lt;br /&gt;
&amp;quot;Alt + выделение мышкой&amp;quot; - позволяет выделять вертикальные фрагменты текста&lt;br /&gt;
===Как узнать количество установленных в CListCtrl столбцов ?===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CListCtrl* pL=...; //указатель на переменную-контрол&lt;br /&gt;
&lt;br /&gt;
int count=pL-&amp;gt;GetHeaderCtrl()-&amp;gt;GetItemCount();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как получить иконку приложения?===&lt;br /&gt;
Если приложение запущено, то нужно найти его главное окно и&lt;br /&gt;
послать ему сообщение WM_GETICON.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//функция возвращант хендл иконки &lt;br /&gt;
LRESULT SendMessage(hWnd, WM_GETICON, wParam, 0);&lt;br /&gt;
&lt;br /&gt;
//hWnd == хендл окна приложения&lt;br /&gt;
//wParam == &lt;br /&gt;
//	1)==ICON_BIG - получить большую иконку&lt;br /&gt;
//	2)==ICON_SMALL - получить маленькую иконку&lt;br /&gt;
//	3)==ICON_SMALL2 - получить маленькую иконку, если она определена&lt;br /&gt;
//				в приложении. Если её нет, то маленькую иконку, &lt;br /&gt;
//				сгенерированную системой из большой иконки&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как в CString можно найти или вырезать часть строки?===&lt;br /&gt;
есть такие методы в CString :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//вырезает кусок строки&lt;br /&gt;
CString Mid(int nFirst) const;&lt;br /&gt;
CString Mid(int nFirst,  int nCount) const;&lt;br /&gt;
&lt;br /&gt;
//возвращает кусок строки (сначала или с конца)&lt;br /&gt;
CString Left(int nCount ) const;&lt;br /&gt;
CString Right(int nCount ) const;&lt;br /&gt;
&lt;br /&gt;
//возвращает начальный кусок строки, в котором есть только&lt;br /&gt;
//символы из набора,представленного в lpszCharSet&lt;br /&gt;
CString SpanIncluding(LPCTSTR lpszCharSet ) const;&lt;br /&gt;
&lt;br /&gt;
//возвращает начальный кусок строки, в котором нет&lt;br /&gt;
//символов из набора,представленного в lpszCharSet&lt;br /&gt;
CString SpanExcluding(LPCTSTR lpszCharSet ) const; &lt;br /&gt;
&lt;br /&gt;
//убирает &amp;quot;пробелоподобные&amp;quot; символы из самого начала строки&lt;br /&gt;
//(то есть - пробел, табуляцию (\t) , возврат каретки, перевод строки (/r/n))&lt;br /&gt;
void TrimLeft();&lt;br /&gt;
//убирает все повторы символа из самого начала строки&lt;br /&gt;
void TrimLeft(TCHAR chTarget );&lt;br /&gt;
//убирает из самого начала строки все символа из набора lpszTargets &lt;br /&gt;
void TrimLeft(LPCTSTR lpszTargets ); &lt;br /&gt;
&lt;br /&gt;
void TrimRight();&lt;br /&gt;
void TrimRight(TCHAR chTarget );&lt;br /&gt;
void TrimRight(LPCTSTR lpszTargets ); &lt;br /&gt;
&lt;br /&gt;
//поиск в строке&lt;br /&gt;
int Find( TCHAR ch ) const;&lt;br /&gt;
int Find( LPCTSTR lpszSub ) const;&lt;br /&gt;
int Find( TCHAR ch, int nStart ) const;&lt;br /&gt;
int Find( LPCTSTR pstr, int nStart ) const;&lt;br /&gt;
&lt;br /&gt;
//поиск, начиная с конца&lt;br /&gt;
int ReverseFind( TCHAR ch ) const;&lt;br /&gt;
&lt;br /&gt;
//поиск позиции первого символа, одного из набора,&lt;br /&gt;
// представленного в lpszCharSet&lt;br /&gt;
int FindOneOf( LPCTSTR lpszCharSet ) const;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Есть у меня CListBox и я в ходе выполнения программы добавляю в него строки. Но я не могу посмотреть что именно добавляется. Вывод результатов происходит в конце выполнения процедуры...===&lt;br /&gt;
Если нужно делать принудительную перерисовку окна во время&lt;br /&gt;
длительных вычислений, то нужно вызывать для окна, которое&lt;br /&gt;
надо перерисовать метод&lt;br /&gt;
  RedrawWindow()&lt;br /&gt;
с параметрами по умолчанию, или пару&lt;br /&gt;
  Invalidate(0);&lt;br /&gt;
  UpdateWindow();&lt;br /&gt;
Это приводит к пометке всего окна к перерисовке и отправлению&lt;br /&gt;
сообщения WM_PAINT в оконную процедуру в обход очереди&lt;br /&gt;
сообщений, вызывая немедленную перерисовку окна.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CWnd* pw=...;//окно , которое надо перерисовывать&lt;br /&gt;
&lt;br /&gt;
for(int i=0;i&amp;lt;10000)&lt;br /&gt;
{&lt;br /&gt;
	//меняется содержимое окна&lt;br /&gt;
	//...&lt;br /&gt;
&lt;br /&gt;
	//немедленная перерисовка&lt;br /&gt;
	pw-&amp;gt;Invalidate(0);&lt;br /&gt;
	pw-&amp;gt;UpdateWindow();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Я написал DLL , которую используют несколько приложений. Всё вроде работает, но когда происходит очередной вызов функции из DLL , почему то данные в функции обнуляются. С чем это связано ?===&lt;br /&gt;
Переменные и массивы в DLL, содержимое которых должно использоваться несколькими процессами, должны объявляться статическими. Статическая переменная или массив инициализируются только один раз в момент загрузки DLL.&lt;br /&gt;
Пример:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DWORD calltest()&lt;br /&gt;
{&lt;br /&gt;
	//будет выполнено только при первом вызове&lt;br /&gt;
	static DWORD callcount=0;&lt;br /&gt;
	static DWORD str[1000]={0}; &lt;br /&gt;
&lt;br /&gt;
	//будет выполняться каждый раз&lt;br /&gt;
	return ++callcount;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как открыть проекцию файла в память и как с ней работать?===&lt;br /&gt;
Как открыть проекцию файла в память и как с ней работать?&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HANDLE CreateFileMapping(&lt;br /&gt;
  HANDLE hFile,	//хендл уже открытого файла&lt;br /&gt;
  LPSECURITY_ATTRIBUTES lpAttributes,&lt;br /&gt;
  DWORD flProtect,	//способ открытия проекции&lt;br /&gt;
  DWORD dwMaximumSizeHigh,	//размер файла (старшие 4 байта , обычно==0)&lt;br /&gt;
  DWORD dwMaximumSizeLow,	//размер файла (младшие 4 байта)&lt;br /&gt;
  LPCTSTR lpName&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Доступ к созданной проекции производится процедурой&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LPVOID MapViewOfFile(&lt;br /&gt;
  HANDLE hFileMappingObject, //хендл проекции&lt;br /&gt;
  DWORD dwDesiredAccess,	//способ работы с проекцией&lt;br /&gt;
  DWORD dwFileOffsetHigh,&lt;br /&gt;
  DWORD dwFileOffsetLow, //смещение от начала файла (младшие 4 байта)&lt;br /&gt;
  SIZE_T dwNumberOfBytesToMap //длина в байтах (если ==0 - то весь файл)&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
далее с файлом можно работать как с обычным массивом в памяти.&lt;br /&gt;
&lt;br /&gt;
После работы с проекцией , её надо освободить процедурой&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
BOOL UnmapViewOfFile(&lt;br /&gt;
  LPCVOID lpBaseAddress //адрес, который вернула процедура MapViewOfFile&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Пример.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HANDLE hMapFile=0;//для проекции&lt;br /&gt;
&lt;br /&gt;
HANDLE hFile=...;//хендл уже открытого файла&lt;br /&gt;
DWORD dwdFileLen=...;//размер открытого файла&lt;br /&gt;
&lt;br /&gt;
//создаём проекцию &amp;quot;только для чтения&amp;quot;&lt;br /&gt;
hMapFile=::CreateFileMapping(hFile,0,PAGE_READONLY,0,dwdFileLen,0);&lt;br /&gt;
&lt;br /&gt;
//хендл hFile можно закрыть уже здесь, в принципе,&lt;br /&gt;
//но мы сделаем это позже&lt;br /&gt;
&lt;br /&gt;
//получаем доступ к проекции (тоже только для чтения)&lt;br /&gt;
BYTE* pbyFile=(BYTE*)::MapViewOfFile(hMapFile,FILE_MAP_READ,0,0,0);&lt;br /&gt;
&lt;br /&gt;
///////////////////&lt;br /&gt;
//тут работаем с массивом pbyFile[dwdFileLen] как с обычным,&lt;br /&gt;
//только не забываем, что он открыт только для чтения&lt;br /&gt;
//...&lt;br /&gt;
//...&lt;br /&gt;
//...&lt;br /&gt;
///////////////////&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//отключаем файл данных от адресного пространства&lt;br /&gt;
UnmapViewOfFile(pbyFile);&lt;br /&gt;
&lt;br /&gt;
//освобождаем хендл проекции&lt;br /&gt;
CloseHandle(hMapFile)&lt;br /&gt;
&lt;br /&gt;
//освобождаем хендл открытого файла&lt;br /&gt;
CloseHandle(hFile);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Использую MFC Grid control 2.25 , не получается отобразить картинку в ячейке. Как это делается ?===&lt;br /&gt;
Нужно создать список изображений (CImageList) , затем передать указатель на список в контрол. Поскольку контрол лишь копирует указатель , список должен создаваться динамически, либо быть членом класса, экземпляр которого существует всё время работы контрола.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 m_GridMarket&lt;br /&gt;
CImageList m_ImageList;&lt;br /&gt;
CGridCtrL m_Grid1&lt;br /&gt;
...&lt;br /&gt;
...&lt;br /&gt;
//неким образом создаётся список&lt;br /&gt;
m_ImageList.Create(...);&lt;br /&gt;
//...&lt;br /&gt;
&lt;br /&gt;
//вставляем в контрол&lt;br /&gt;
m_Grid1.SetImageList(&amp;amp;m_ImageList);&lt;br /&gt;
&lt;br /&gt;
//&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как при помощи IPicture отобразить картинку из файла? ===&lt;br /&gt;
Пример - несложная функция, отображающая картинку из файла&lt;br /&gt;
&lt;br /&gt;
поддерживаются форматы&lt;br /&gt;
BMP, GIF, JPEG, PNG, TIFF, EMF&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;quot;atlconv.h&amp;quot;&lt;br /&gt;
#define HandleIsValid(H) (H!=(HANDLE)-1 &amp;amp;&amp;amp; H!=(HANDLE)0)&lt;br /&gt;
&lt;br /&gt;
//*pDestDC - CDC, на который предполагается вывод картинки&lt;br /&gt;
//pchzFilePath - путь к файлу&lt;br /&gt;
//pWid - (возвращает) ширина картинки&lt;br /&gt;
//pHig - (возвращает) высота картинки&lt;br /&gt;
bool DrawBitmapFromFile(CDC* pDestDC,const char* pchzFilePath,int *pWid=0,int *pHig=0)&lt;br /&gt;
{&lt;br /&gt;
	bool result=false;&lt;br /&gt;
&lt;br /&gt;
	if(pWid)*pWid=0;&lt;br /&gt;
	if(pHig)*pHig=0;&lt;br /&gt;
&lt;br /&gt;
	int Wid=0;&lt;br /&gt;
	int Hig=0;&lt;br /&gt;
&lt;br /&gt;
	IPicture* pPic=0;&lt;br /&gt;
	try&lt;br /&gt;
	{&lt;br /&gt;
		IPicture* ptmpPic=0;&lt;br /&gt;
		USES_CONVERSION;&lt;br /&gt;
		HRESULT hr;&lt;br /&gt;
&lt;br /&gt;
		CString txt=pchzFilePath;&lt;br /&gt;
		hr= ::OleLoadPicturePath(&lt;br /&gt;
			const_cast&amp;lt;LPOLESTR&amp;gt;(T2COLE(txt)),&lt;br /&gt;
			0,0,0,IID_IPicture,&lt;br /&gt;
			reinterpret_cast&amp;lt;void **&amp;gt;(&amp;amp;ptmpPic)&lt;br /&gt;
			);&lt;br /&gt;
&lt;br /&gt;
		if(hr==S_OK &amp;amp;&amp;amp; ptmpPic)&lt;br /&gt;
		{&lt;br /&gt;
			pPic=ptmpPic;&lt;br /&gt;
		}&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			throw 0;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		OLE_XPOS_HIMETRIC cxSrc;&lt;br /&gt;
		OLE_YPOS_HIMETRIC cySrc;&lt;br /&gt;
&lt;br /&gt;
		if(S_OK!=pPic-&amp;gt;get_Width(&amp;amp;cxSrc))throw 0;&lt;br /&gt;
		if(S_OK!=pPic-&amp;gt;get_Height(&amp;amp;cySrc))throw 0;&lt;br /&gt;
&lt;br /&gt;
		Wid=cxSrc/26;&lt;br /&gt;
		Hig=cySrc/26;&lt;br /&gt;
&lt;br /&gt;
		//рисуем&lt;br /&gt;
		if(S_OK !=pPic-&amp;gt;Render(pDestDC-&amp;gt;GetSafeHdc(),&lt;br /&gt;
			0,Hig,Wid,-Hig,0,0,cxSrc,cySrc,0))throw 0;&lt;br /&gt;
	}&lt;br /&gt;
	catch(...)&lt;br /&gt;
	{&lt;br /&gt;
		result=false;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if(pPic)&lt;br /&gt;
	{&lt;br /&gt;
		pPic-&amp;gt;Release();&lt;br /&gt;
		pPic=0;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	if(pWid)*pWid=Wid;&lt;br /&gt;
	if(pHig)*pHig=Hig;&lt;br /&gt;
&lt;br /&gt;
	return result;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===У меня модальное диалоговое окно, в нем поле редактирования мультилайновое, т.е. чтобы перейти на новую строку надо нажать ентер, но вызывается стандартный обработчик диалогового окна. Подскажите, что делать?===&lt;br /&gt;
Нужно в редакторе ресурсов поставить для CEdit окошка галочку&lt;br /&gt;
свойства WantReturn,&lt;br /&gt;
&lt;br /&gt;
или добавить ES_WANTRETURN при создании CEdit контрола динамически.&lt;br /&gt;
===Как выводят картинку-логотип(splash screen) при запуске программы? То есть, когда загружается программа на экран выводится картинка, потом она исчезает(загрузка программы закончена) и пользователь может приступать к работе ===&lt;br /&gt;
Для этого используется класс, производный от CDialog. Этот диалог после создания показывает себя на экран, выводя на себя рисунок. Также запускает таймет, по срабатывани которого диалог гасится. Создаётся диалог InitInstance приложения.&lt;br /&gt;
&lt;br /&gt;
В VC6++ также есть уже готовый компонент&lt;br /&gt;
Project-&amp;gt;Add To Project -&amp;gt; Components and Controls-&amp;gt;(в папке &amp;quot;Visual C++ Components&amp;quot; есть SplashScreen.)&lt;br /&gt;
===Как сделать, чтобы при выпадении списка у ComboBox была не одна строка, а больше, вроде все свойства покрутил, не помогает Вместо выпадающего списка одна строка и скролл...===&lt;br /&gt;
В редакторе ресурсов надо щелкнуть в комбобоксе на треугольнике - появляется рамка для растягивания вниз - размер выпадающего списка.&lt;br /&gt;
===В VC++.net , что делать после того, как на форму установил ActiiveX ListView, как объявить класс и переменную для этого элемента?===&lt;br /&gt;
Щёлкнуть правой кнопкой мыши на элементе , в меню - add variable или add class&lt;br /&gt;
===Как вставить данные в буфер обмена (Clipboard) ? Как их оттуда вытащить ?===&lt;br /&gt;
&lt;br /&gt;
1) копирование в буфер обмена:&lt;br /&gt;
&lt;br /&gt;
  1.Готовим данные&lt;br /&gt;
    а.Выделяем память из кучи,  вызывая GlobalAlloc()&lt;br /&gt;
    б.Получаем указатель на выделенную память, вызывая GlobalLock()&lt;br /&gt;
    в.Заполняем данные&lt;br /&gt;
    г.Освобождаем указатель , вызывая GlobalUnlock();&lt;br /&gt;
&lt;br /&gt;
  2.Открываем буфер обмена , вызывая OpenClipboard();&lt;br /&gt;
  3.Очищаем буфер, вызывая EmptyClipboard();&lt;br /&gt;
  4.Вызываем SetClipboardData() один раз для каждого формата&lt;br /&gt;
      вставляемых данных (имеется в виду - если одни и те же&lt;br /&gt;
      данные представлены в разных форматах, и приложение&lt;br /&gt;
      может эти форматы создать)&lt;br /&gt;
  5.Закрываем буфер, вызывая CloseClipboard();&lt;br /&gt;
  6.ВЫЗЫВАТЬ GlobalFree() НЕ НУЖНО , в этом случае это&lt;br /&gt;
      предоставлено системе&lt;br /&gt;
&lt;br /&gt;
Скажем, хотим поместить в буфер обмена туда текст.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	//готовим данные&lt;br /&gt;
	//выделяем из кучи память для данных&lt;br /&gt;
	HANDLE hglbCopy = GlobalAlloc(GMEM_MOVEABLE,10);&lt;br /&gt;
	if(!hglbCopy)return;&lt;br /&gt;
&lt;br /&gt;
	//получаем указатель&lt;br /&gt;
	void* lpStr = GlobalLock(hglbCopy);&lt;br /&gt;
	if(!lpStr)return;&lt;br /&gt;
&lt;br /&gt;
	//заполняем данные&lt;br /&gt;
	strcpy((char*)lpStr,&amp;quot;my text&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	//освобождаем указатель&lt;br /&gt;
	GlobalUnlock(hglbCopy);&lt;br /&gt;
	lpStr=0;&lt;br /&gt;
&lt;br /&gt;
	//открываем буфер обмена&lt;br /&gt;
	OpenClipboard();&lt;br /&gt;
	//очищаем&lt;br /&gt;
	EmptyClipboard();&lt;br /&gt;
&lt;br /&gt;
	//текстовый формат&lt;br /&gt;
	SetClipboardData(CF_TEXT,hglbCopy);&lt;br /&gt;
&lt;br /&gt;
	//закрываем буфер&lt;br /&gt;
	CloseClipboard();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
2) извлечение из буфера обмена&lt;br /&gt;
&lt;br /&gt;
  1.Проверяем, что поддерживается нужный формат данных,&lt;br /&gt;
      вызывая IsClipboardFormatAvailable()&lt;br /&gt;
  2.Открываем буфер обмена , вызывая OpenClipboard();&lt;br /&gt;
  3.Достаём данные&lt;br /&gt;
   а.Получаем из буфера хендл требуемого формата,&lt;br /&gt;
      вызывая GetClipboardData()&lt;br /&gt;
    б.Получаем указатель на выделенную память, вызывая GlobalLock()&lt;br /&gt;
    в.Работаем с данными&lt;br /&gt;
    г.Освобождаем указатель , вызывая GlobalUnlock();&lt;br /&gt;
  4.Закрываем буфер, вызывая CloseClipboard();&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	//Проверяем, что поддерживается нужный формат данных,&lt;br /&gt;
	if(!IsClipboardFormatAvailable(CF_TEXT))return;&lt;br /&gt;
&lt;br /&gt;
	//открываем буфер обмена&lt;br /&gt;
	OpenClipboard();&lt;br /&gt;
&lt;br /&gt;
	//достаём данные&lt;br /&gt;
&lt;br /&gt;
	//текстовый формат&lt;br /&gt;
	HANDLE hglbCopy = GetClipboardData(CF_TEXT);&lt;br /&gt;
	if(!hglbCopy)return;&lt;br /&gt;
&lt;br /&gt;
	//получаем указатель&lt;br /&gt;
	void* lpStr = GlobalLock(hglbCopy);&lt;br /&gt;
	if(!lpStr)return;&lt;br /&gt;
&lt;br /&gt;
	//читаем данные&lt;br /&gt;
	char data[10];&lt;br /&gt;
	memmove(data,lpStr,sizeof(data));&lt;br /&gt;
&lt;br /&gt;
	//освобождаем указатель&lt;br /&gt;
	GlobalUnlock(hglbCopy);&lt;br /&gt;
	lpStr=0;&lt;br /&gt;
&lt;br /&gt;
	//закрываем буфер&lt;br /&gt;
	CloseClipboard();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как получить полный путь к экзешнику из самой программы ?===&lt;br /&gt;
В командную строку первым параметром система всегда передаёт заключённый в кавычки полный путь к файлу запущенной программы Достаём путь таким образом :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
BOOL CMyApp::InitInstance()&lt;br /&gt;
{&lt;br /&gt;
	//добыча полного имени экзешника&lt;br /&gt;
	CString csFullExeName;&lt;br /&gt;
	{&lt;br /&gt;
		CString csAppName=GetCommandLine();&lt;br /&gt;
		csAppName.Delete(0,1);&lt;br /&gt;
		csAppName.Replace('\&amp;quot;','\0');&lt;br /&gt;
		csFullExeName=(const char*)csAppName;&lt;br /&gt;
	}&lt;br /&gt;
	//теперь csFullExeName - содержит искомый путь&lt;br /&gt;
&lt;br /&gt;
	//...&lt;br /&gt;
	//...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Каким способом можно exe файл может заменить самого себя? То есть, моя программа обновляется, например, через Internet, и хочет обновить свой exe-файл. Но так как он в данный момент запущен - это будет, естественно, запрещено. Как это можно проще всего сделать?===&lt;br /&gt;
Один из способов - сделать копию экзешника и из него обновиться&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define def_exeNAMEup	&amp;quot;c:\\myprog_update.exe&amp;quot;&lt;br /&gt;
#define def_exeNAMEdnld	&amp;quot;c:\\myprog_downloaded.exe&amp;quot;&lt;br /&gt;
#define def_keyUdate	&amp;quot;/update&amp;quot;&lt;br /&gt;
&lt;br /&gt;
void CTESTFAQApp::UpdateItself()&lt;br /&gt;
{&lt;br /&gt;
	//добыча полного имени экзешника&lt;br /&gt;
	CString csFullExeName;&lt;br /&gt;
	{&lt;br /&gt;
		CString csAppName=GetCommandLine();&lt;br /&gt;
		csAppName.Delete(0,1);&lt;br /&gt;
		csAppName.Replace('\&amp;quot;','\0');&lt;br /&gt;
		csFullExeName=(const char*)csAppName;&lt;br /&gt;
	}&lt;br /&gt;
	//теперь csFullExeName - содержит искомый путь&lt;br /&gt;
&lt;br /&gt;
	//делаем копию экзешника с другим именем&lt;br /&gt;
	CopyFile(csFullExeName,def_exeNAMEup,0);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	//передаём в параметры нового процесса ключ и путь к текущему файлу&lt;br /&gt;
	CString csParams=def_keyUdate;&lt;br /&gt;
	csParams+=&amp;quot; &amp;quot;;&lt;br /&gt;
	csParams+=csFullExeName;&lt;br /&gt;
&lt;br /&gt;
	//запускаем копию&lt;br /&gt;
	STARTUPINFO si;&lt;br /&gt;
	PROCESS_INFORMATION pi;&lt;br /&gt;
	ZeroMemory(&amp;amp;si,sizeof(si));&lt;br /&gt;
	si.cb = sizeof(si);&lt;br /&gt;
	ZeroMemory(&amp;amp;pi,sizeof(pi));&lt;br /&gt;
	if(CreateProcess(def_exeNAMEup,def_keyUdate,0,0,0,0,0,0,&amp;amp;si,&amp;amp;pi))&lt;br /&gt;
	{&lt;br /&gt;
		//завершаем текущий процесс&lt;br /&gt;
		ExitFromMyApp();&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void CTESTFAQApp::ExitFromMyApp()&lt;br /&gt;
{&lt;br /&gt;
	exit(0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
BOOL CTESTFAQApp::InitInstance()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
	//смотрим, не запустили ли для апдейта?&lt;br /&gt;
&lt;br /&gt;
	CString txt;&lt;br /&gt;
	txt=m_lpCmdLine;&lt;br /&gt;
	if(txt.Find(def_keyUdate)==0)&lt;br /&gt;
	{&lt;br /&gt;
		//делаем айдейт&lt;br /&gt;
		txt.Replace(def_keyUdate,&amp;quot;&amp;quot;);&lt;br /&gt;
		txt.TrimLeft();&lt;br /&gt;
&lt;br /&gt;
		CString csFullExeName=txt;&lt;br /&gt;
&lt;br /&gt;
		//берём откуда то уже скачанный файл обновления&lt;br /&gt;
		//...&lt;br /&gt;
		CString csFull_Downloaded_ExeName=def_exeNAMEdnld;&lt;br /&gt;
&lt;br /&gt;
		//копируем файл (обновляем старый то есть)&lt;br /&gt;
		CopyFile(csFull_Downloaded_ExeName,csFullExeName,0);&lt;br /&gt;
&lt;br /&gt;
		//запускаем обновлённого мученника&lt;br /&gt;
		STARTUPINFO si;&lt;br /&gt;
		PROCESS_INFORMATION pi;&lt;br /&gt;
		ZeroMemory(&amp;amp;si,sizeof(si));&lt;br /&gt;
		si.cb = sizeof(si);&lt;br /&gt;
		ZeroMemory(&amp;amp;pi,sizeof(pi));&lt;br /&gt;
		if(CreateProcess(csFullExeName,0,0,0,0,0,0,0,&amp;amp;si,&amp;amp;pi))&lt;br /&gt;
&lt;br /&gt;
		ExitFromMyApp();&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
	//...&lt;br /&gt;
	//...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Есть строка символов (страничка из Инета) в кодировке utf-8 (строка char*). Как мне ее получить в формате String&lt;br /&gt;
или в char* в кодировке ANSI (cp 1251) ?===&lt;br /&gt;
Можно перевести строку из UTF8 в Unicode, затем из Unicode в 1251&lt;br /&gt;
&lt;br /&gt;
Ниже приведена структура, содержащая процедуры перекодирования,&lt;br /&gt;
а также процедуру с примером использования&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//описание структуры&lt;br /&gt;
struct coder&lt;br /&gt;
{&lt;br /&gt;
	//utf8-&amp;gt;unicode&lt;br /&gt;
	static wchar_t* utf8_to_unicode__dontForgetDeleteArr(const char *utf8_string)&lt;br /&gt;
	{&lt;br /&gt;
		wchar_t* pRes=0;&lt;br /&gt;
		int res_len=0;&lt;br /&gt;
&lt;br /&gt;
		//тест на возможность преобразования&lt;br /&gt;
		res_len=MultiByteToWideChar(CP_UTF8,0,utf8_string,-1,0,0);&lt;br /&gt;
		if(!res_len)return 0;&lt;br /&gt;
&lt;br /&gt;
		//выделяем память&lt;br /&gt;
		pRes = new wchar_t[res_len];&lt;br /&gt;
		if(!pRes)return 0;&lt;br /&gt;
&lt;br /&gt;
		//преобразование&lt;br /&gt;
		if(!MultiByteToWideChar(CP_UTF8,0,utf8_string,-1,pRes,res_len))&lt;br /&gt;
		{&lt;br /&gt;
			delete [] pRes;&lt;br /&gt;
			return 0;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		return pRes;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	//unicode-&amp;gt;1251&lt;br /&gt;
	static char * unicode_to_1251__dontForgetDeleteArr(const wchar_t *unicode_string)&lt;br /&gt;
	{&lt;br /&gt;
		char* pRes=0;&lt;br /&gt;
		int res_len=0;&lt;br /&gt;
&lt;br /&gt;
		//тест на возможность преобразования&lt;br /&gt;
		res_len = WideCharToMultiByte(1251,0,unicode_string,-1,0,0,0,0);&lt;br /&gt;
		if(!res_len)return 0;&lt;br /&gt;
&lt;br /&gt;
		//выделяем память&lt;br /&gt;
		pRes=new char[res_len];&lt;br /&gt;
		if(!pRes)return 0;&lt;br /&gt;
&lt;br /&gt;
		//преобразование&lt;br /&gt;
		if(!WideCharToMultiByte(1251,0,unicode_string,-1,pRes,res_len,0,0))&lt;br /&gt;
		{&lt;br /&gt;
			delete [] pRes;&lt;br /&gt;
			return 0;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		return pRes;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	//процедура с примером&lt;br /&gt;
	static void Example()&lt;br /&gt;
	{&lt;br /&gt;
		wchar_t* unicode_string=0;&lt;br /&gt;
		char* cp1251_string=0;&lt;br /&gt;
&lt;br /&gt;
		//исходный текст&lt;br /&gt;
		char utf8_string[] = &amp;quot;UTF-8 + СЂСѓСЃСЃРєРёР№ С‚РµРєСЃС‚&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
		for(;;)&lt;br /&gt;
		{&lt;br /&gt;
&lt;br /&gt;
			unicode_string=utf8_to_unicode__dontForgetDeleteArr(utf8_string);&lt;br /&gt;
			if(!unicode_string)&lt;br /&gt;
			{&lt;br /&gt;
				AfxMessageBox(&amp;quot;Не удалось конвертировать в unicode!&amp;quot;);&lt;br /&gt;
				break;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			cp1251_string = unicode_to_1251__dontForgetDeleteArr(unicode_string);&lt;br /&gt;
&lt;br /&gt;
			if(!cp1251_string)&lt;br /&gt;
			{&lt;br /&gt;
				AfxMessageBox(&amp;quot;Не удалось конвертировать из unicode!&amp;quot;);&lt;br /&gt;
				break;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			break;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		//cp1251_string - результат&lt;br /&gt;
		AfxMessageBox(cp1251_string);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
		//не забываем удалить массивы&lt;br /&gt;
		if(unicode_string)&lt;br /&gt;
		{&lt;br /&gt;
			delete [] unicode_string;&lt;br /&gt;
			unicode_string=0;&lt;br /&gt;
		}&lt;br /&gt;
		if(cp1251_string)&lt;br /&gt;
		{&lt;br /&gt;
			delete [] cp1251_string;&lt;br /&gt;
			cp1251_string=0;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
//вызов примера&lt;br /&gt;
coder::Example();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как организовать взаимодействие программы на VC.net с Access-овской базой данных?===&lt;br /&gt;
Проще всего подключить ADO компоненты и сделать все на них.&lt;br /&gt;
Компоненты  ADO (ADODC,DATAGRID и т.п.) это ActiveX.&lt;br /&gt;
В редакторе ресурсов, во всплывающем меню, есть Insert ActiveX Control -&amp;gt; открывается список всех компоент,&lt;br /&gt;
зарегистрированых на машине. Нужно найти компоненты (Это компоненты от MS и они помечены (OLEDB)) и вставить их в диалог. Для того что бы иметь возможность управлять ими, нужно импортировать обертки для них, это делается при помощи ClassWisard, там есть импорт-&amp;gt;класс-&amp;gt;указать файл с компоентой (OSX).&lt;br /&gt;
Появляется список всех классов, объявленых внутри.&lt;br /&gt;
Проставляем галочки, нажимаем ОК.&lt;br /&gt;
&lt;br /&gt;
[[Category:FAQ]]&lt;/div&gt;</summary>
		<author><name>Mczim</name></author>	</entry>

	<entry>
		<id>https://wiki.shelek.ru/index.php?title=FAQ:WinAPI,_VCPP_Part_2&amp;diff=395</id>
		<title>FAQ:WinAPI, VCPP Part 2</title>
		<link rel="alternate" type="text/html" href="https://wiki.shelek.ru/index.php?title=FAQ:WinAPI,_VCPP_Part_2&amp;diff=395"/>
				<updated>2008-08-12T21:01:19Z</updated>
		
		<summary type="html">&lt;p&gt;Mczim: добавил двоеточие в использовать процедуру API:&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Я создал простой проект DLL на VC++ 6.0. Все скомпилилось нормально. Но в другой программе не могу вызвать функцию из DLL - программа не может найти функцию по имени.===&lt;br /&gt;
В папке проекта нужно создать обычный файл txt и переименовать в&lt;br /&gt;
&amp;quot;имя_проекта_dll.DEF&amp;quot;&lt;br /&gt;
&lt;br /&gt;
В файле перечислить весь экспорт:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
EXPORTS&lt;br /&gt;
	MyFunctionName1&lt;br /&gt;
	MyFunctionName2&lt;br /&gt;
	MyFunctionName3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
И затем включить файл этот в дерево проекта.&lt;br /&gt;
===Есть ли какой-нибудь макрос в VC7, возвращающий строку вида ClassName::FunctionName внутри соответствующей функции?===&lt;br /&gt;
__FUNCSIG__&lt;br /&gt;
===Как динамически подгрузить ресурсы к ATL проекту?===&lt;br /&gt;
имеется класс&lt;br /&gt;
Код:&lt;br /&gt;
 class CComModule : public _ATL_MODULE&lt;br /&gt;
&lt;br /&gt;
в котором определена переменная m_hInstResource.&lt;br /&gt;
Нужно присвоить переменной значение хэндла Dll.&lt;br /&gt;
===Как динамически подгрузить ресурсы к MFC проекту?===&lt;br /&gt;
InitInstance() загружается Dll с ресурсами, затем вызывается&lt;br /&gt;
функция AfxSetResourceHandle c параметром - хэндлом этой dll.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
BOOL CMyApp::InitInstance()&lt;br /&gt;
{&lt;br /&gt;
	HINSTANCE hRes = NULL;&lt;br /&gt;
	hRes= LoadLibrary(&amp;quot;ResourceD.dll&amp;quot;);&lt;br /&gt;
	if(hRes)&lt;br /&gt;
	{&lt;br /&gt;
		AfxSetResourceHandle(hRes);&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	return CWinApp::InitInstance();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===возможно ли использование файлов чистого С и С++ в одном проекте? Если да, то каковы должны быть настройки компилятора? А то ругается на Unexpected end of file while looking for precompiled header directive.===&lt;br /&gt;
Компилятор распознает язык по расширению файла и устанавливает на весь файл.&lt;br /&gt;
Нельзя часть файла компилировать как С, а другую как С++. Для того, чтобы функции Си вызывать в С++, а функции С++ в Си, их надо декларировать для С++ как&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   extern &amp;quot;C&amp;quot;&lt;br /&gt;
	#ifdef __cplusplus&lt;br /&gt;
		extern &amp;quot;C&amp;quot;&lt;br /&gt;
		{&lt;br /&gt;
	#endif&lt;br /&gt;
	&lt;br /&gt;
		int func1(int );&lt;br /&gt;
		int func2(int );&lt;br /&gt;
		int func3(int );&lt;br /&gt;
	&lt;br /&gt;
	#ifdef __cplusplus&lt;br /&gt;
		}&lt;br /&gt;
	#endif&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Возможно, надо стереть *.pch файл и собрать снова.&lt;br /&gt;
&lt;br /&gt;
Также в настройках компилятора можно попробовать отключить&lt;br /&gt;
прекомпиленые хедеры для конкретного файла&lt;br /&gt;
   &amp;quot;C/С++&amp;quot;-&amp;gt;&amp;quot;Precompiled Header&amp;quot;&lt;br /&gt;
(правда перекомпиляция будет длится немного дольше)&lt;br /&gt;
&lt;br /&gt;
Или можно подключить в файлах stdafx.h (тогда не придется отключать use precompiled header )&lt;br /&gt;
&lt;br /&gt;
===где найти описание nmake для VC++6?===&lt;br /&gt;
В MSDN&lt;br /&gt;
http://msdn.microsoft.com/library/en-us/vcug98/html/_asug_overview.3a_.nmake_reference.asp&lt;br /&gt;
===Каким образом можно установить значение переменной для вызывающего процесса/потока из своей собственной DLL? Проблема заключается в том, что несмотря на то, что все линкуется нормально, значение переменной процесса не изменяется, когда я его устанавливаю вручную в библиотеке.===&lt;br /&gt;
Проблема вызвана тем, что каждая влинкованная libc (одна линкуется в&lt;br /&gt;
исполняемый файл, ещё одна в dll) содержит свою копию переменной.&lt;br /&gt;
&lt;br /&gt;
1) Можно воспользоваться динамически подгружаемой библиотекой С runtime.&lt;br /&gt;
Для этого приложение и dll надо компилировать с ключом /MD (или MDd для отладки).&lt;br /&gt;
В таком случае переменная будет общей для приложения и dll.&lt;br /&gt;
&lt;br /&gt;
2) Можно в основном модуле программы (тот, который станет .exe) сделать&lt;br /&gt;
&amp;quot;дырку&amp;quot; (backdoor), через которую присваивать переменной (int errno) значение:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
__declspec(dllexport) void set_errno(int code)&lt;br /&gt;
{&lt;br /&gt;
	errno = code;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
В dll при подключении к процессу надо извлечь из модуля программы указатель на эту функцию.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	typedef void (*SETINT)(int);&lt;br /&gt;
	SETINT g_set_errno=0;&lt;br /&gt;
	void set_errno_in_exe(int code)&lt;br /&gt;
	{&lt;br /&gt;
		if(g_set_errno) g_set_errno(code);&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved )&lt;br /&gt;
	{&lt;br /&gt;
		HANDLE hModule; // Handle to the main module&lt;br /&gt;
		if(fdwReason == DLL_PROCESS_ATTACH )&lt;br /&gt;
		{&lt;br /&gt;
			hModule = GetModuleHandle(NULL);&lt;br /&gt;
			if (hModule == NULL) return FALSE;&lt;br /&gt;
			g_set_errno = (SETINT) GetProcAddress(hModule, &amp;quot;set_errno&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
		return TRUE;&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
В нужном месте в dll вместо присваивания errno нужно вызывать внешнюю функцию&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void inside_dll_func()&lt;br /&gt;
{&lt;br /&gt;
	...&lt;br /&gt;
	...&lt;br /&gt;
	set_errno_in_exe(ERROR_CODE);&lt;br /&gt;
	...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Как закрасить фон окна CWnd?===&lt;br /&gt;
Нужно добавить обработчик сообщения WM_CTLCOLOR&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class CMyDialog : public CDialog&lt;br /&gt;
{&lt;br /&gt;
	//&lt;br /&gt;
	CBrush m_back_brush;&lt;br /&gt;
	...&lt;br /&gt;
	...&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
//конструктор&lt;br /&gt;
CMyDialog::CMyDialog(): CDialog(CMyDialog::IDD)&lt;br /&gt;
{&lt;br /&gt;
	//создаём кисть фона&lt;br /&gt;
	m_back_brush.CreateSolidBrush(RGB(192,186,207));&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HBRUSH CMyDialog::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) &lt;br /&gt;
{&lt;br /&gt;
	switch(nCtlColor)&lt;br /&gt;
	{&lt;br /&gt;
		//CStatic-контрол&lt;br /&gt;
		case WM_CTLCOLORSTATIC:&lt;br /&gt;
		{&lt;br /&gt;
			//у статиков делаем прозрачный фон&lt;br /&gt;
			pDC-&amp;gt;SetBkMode(TRANSPARENT);&lt;br /&gt;
			//и красный цвет текста&lt;br /&gt;
			pDC-&amp;gt;SetTextColor(RGB(255,0,0));&lt;br /&gt;
	&lt;br /&gt;
			//надо же что-то вернуть :)&lt;br /&gt;
			return (HBRUSH) (m_back_brush.m_hObject);&lt;br /&gt;
		}&lt;br /&gt;
		break;&lt;br /&gt;
	&lt;br /&gt;
		//диалог&lt;br /&gt;
		case WM_CTLCOLORDLG:&lt;br /&gt;
		{&lt;br /&gt;
			//возвращаем хендл кисти нужного фона&lt;br /&gt;
			return (HBRUSH) (m_back_brush.m_hObject);&lt;br /&gt;
		}&lt;br /&gt;
		break;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	//фон по умолчанию&lt;br /&gt;
	return CDialog::OnCtlColor(pDC, pWnd, nCtlColor);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Как определить , что курсор мыши вышел за границу окна?===&lt;br /&gt;
1) Использовать функцию _TrackMouseEvent. Например, есть класс MyST&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class MyST : public CStatic&lt;br /&gt;
{&lt;br /&gt;
	bool m_bTrackingNow;&lt;br /&gt;
	...&lt;br /&gt;
	...&lt;br /&gt;
};&lt;br /&gt;
	&lt;br /&gt;
//в конструкторе&lt;br /&gt;
MyST:MyST()&lt;br /&gt;
{&lt;br /&gt;
	 m_bTrackingNow=false;&lt;br /&gt;
}&lt;br /&gt;
	&lt;br /&gt;
//в обработчике OnMouseMove запускаем отслеживание&lt;br /&gt;
void MyST::OnMouseMove(UINT nFlags, CPoint point)&lt;br /&gt;
{&lt;br /&gt;
	if(!m_bTrackingNow)&lt;br /&gt;
	{&lt;br /&gt;
		m_bTrackingNow=true;&lt;br /&gt;
		TRACKMOUSEEVENT tme;&lt;br /&gt;
		tme.cbSize=sizeof(tme);&lt;br /&gt;
		tme.dwFlags=TME_LEAVE;//отслеживаем выход курсора&lt;br /&gt;
		tme.hwndTrack = m_hWnd;//из этого окна&lt;br /&gt;
	&lt;br /&gt;
		::_TrackMouseEvent(&amp;amp;tme);//&amp;quot;запуск&amp;quot; отслеживания&lt;br /&gt;
		//при выходе курсора за границу окна будет&lt;br /&gt;
		//будет сгенерировано сообщение WM_MOUSELEAVE&lt;br /&gt;
	}&lt;br /&gt;
	...&lt;br /&gt;
	...&lt;br /&gt;
	CStatic::OnMouseMove(nFlags,point);&lt;br /&gt;
}&lt;br /&gt;
	&lt;br /&gt;
//ловим сообщение WM_MOUSELEAVE, для этого&lt;br /&gt;
//переопределяем виртуальную PreTranslateMessage()&lt;br /&gt;
BOOL MyST::PreTranslateMessage(MSG* pMsg)&lt;br /&gt;
{&lt;br /&gt;
	if(pMsg-&amp;gt;message==WM_MOUSELEAVE)&lt;br /&gt;
	{&lt;br /&gt;
		//тут обрабатываем&lt;br /&gt;
		...&lt;br /&gt;
		...&lt;br /&gt;
		m_bTrackingNow=false;&lt;br /&gt;
	}&lt;br /&gt;
	...&lt;br /&gt;
	...&lt;br /&gt;
	return CStatic::PreTranslateMessage(pMsg);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
2) Для случая, когда надо регулировать время &amp;quot;реакции&amp;quot; на выход за границу&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
enum&lt;br /&gt;
{&lt;br /&gt;
	def_TrackTimer_ID		=	1000, //ID таймера&lt;br /&gt;
	def_TrackTimer_value	=	50, //миллисекунд&lt;br /&gt;
};&lt;br /&gt;
	&lt;br /&gt;
MyST::MyST()&lt;br /&gt;
{&lt;br /&gt;
	m_bTrackingNow=false;&lt;br /&gt;
}&lt;br /&gt;
	&lt;br /&gt;
//в обработчике OnMouseMove запускаем таймер&lt;br /&gt;
void MyST::OnMouseMove(UINT nFlags, CPoint point)&lt;br /&gt;
{&lt;br /&gt;
	//перезапуск таймера&lt;br /&gt;
	SetTimer(def_TrackTimer_ID,def_TrackTimer_value,0);&lt;br /&gt;
	m_bTrackingNow=true;&lt;br /&gt;
	...&lt;br /&gt;
	...&lt;br /&gt;
	CStatic::OnMouseMove(nFlags,point);&lt;br /&gt;
}&lt;br /&gt;
	&lt;br /&gt;
void MyST::OnTimer(UINT nIDEvent)&lt;br /&gt;
{&lt;br /&gt;
	if(nIDEvent==def_TrackTimer_ID)&lt;br /&gt;
	{&lt;br /&gt;
		KillTimer(def_TrackTimer_ID);//таймер гасит сам себя&lt;br /&gt;
		//смотрим, где курсор&lt;br /&gt;
		POINT pnt;&lt;br /&gt;
		if(GetCursorPos(&amp;amp;pnt))&lt;br /&gt;
		{&lt;br /&gt;
			if(WindowFromPoint(pnt)!=this)&lt;br /&gt;
			{&lt;br /&gt;
				m_bTrackingNow=false;//вышли за окно&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	CStatic::OnTimer(nIDEvent);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Когда размещаю компонент RichEdit на форму, программа запускается и тут же закрывается. Что здесь не так?===&lt;br /&gt;
Необходимо до начала использования контрола инициализировать работу с классом:&lt;br /&gt;
&lt;br /&gt;
для RichEdit необходимо вызвать функцию AfxInitRichEdit(),&lt;br /&gt;
для RichEdit2 - AfxInitRichEdit2().&lt;br /&gt;
&lt;br /&gt;
Вызывать надо в InitInstance() приложения (в случае для MFC).&lt;br /&gt;
===Как сделать обработчик сообщения для нескольких контролов сразу?===&lt;br /&gt;
Если без помощи визарда, то переопределить виртуальную OnCommand()&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
BOOL CMyDialog::OnCommand(WPARAM wParam, LPARAM lParam) &lt;br /&gt;
{&lt;br /&gt;
	WORD wMess=(wParam&amp;gt;&amp;gt;16);//командное сообщение&lt;br /&gt;
	int nID=(int)(wParam &amp;amp;0x0000ffff));//ID контрола&lt;br /&gt;
	HWND hW=(HWND)lParam;//хендл контрола&lt;br /&gt;
	&lt;br /&gt;
	//смотрим, какой контрол&lt;br /&gt;
	switch(nID)&lt;br /&gt;
	{&lt;br /&gt;
		//кнопки&lt;br /&gt;
		case ID_BN1:&lt;br /&gt;
		case ID_BN2:&lt;br /&gt;
		case ID_BN3:&lt;br /&gt;
		{&lt;br /&gt;
			//смотрим, какое сообщение&lt;br /&gt;
			switch(wMess)&lt;br /&gt;
			{&lt;br /&gt;
				case BN_CLICKED:{	...	}break;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		break;&lt;br /&gt;
	&lt;br /&gt;
		//едиты&lt;br /&gt;
		case ID_ED1:&lt;br /&gt;
		case ID_ED2:&lt;br /&gt;
		case ID_ED3:&lt;br /&gt;
		case ID_ED4:&lt;br /&gt;
		{&lt;br /&gt;
			//смотрим, какое сообщение&lt;br /&gt;
			switch(wMess)&lt;br /&gt;
			{&lt;br /&gt;
				case EN_CHANGE:{	...	}break;&lt;br /&gt;
				case EN_KILLFOCUS:{	...	}break;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		break;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	return CDialog::OnCommand(wParam, lParam);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Когда запускаю программу, то все надписи на русском языке теряются - показываются вопросики. Что делать?===&lt;br /&gt;
Лечится так: непосредственно после создания проекта открываем дерево ресурсов и в свойствах каждого элемента дерева ставим язык Russian. Если этого не сделать сразу, то все русские буквы при компиляции ресурсов потеряются.&lt;br /&gt;
&lt;br /&gt;
===Как в проекте VC6 MFC получить путь, откуда запущен ЕХЕ?===&lt;br /&gt;
Использовать GetModuleFileName():&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	TCHAR pszFileName[MAX_PATH];&lt;br /&gt;
	pszFileName[0]=0;&lt;br /&gt;
	GetModuleFileName(NULL, pszFileName, MAX_PATH);&lt;br /&gt;
	CString stModulePath =  pszFileName;&lt;br /&gt;
	//ищем первый слеш с конца и удаляем&lt;br /&gt;
	//его вместе с именем файла EXE&lt;br /&gt;
	int nEnd = stModulePath.ReverseFind('\\');&lt;br /&gt;
	stModulePath.Delete(nEnd, stModulePath.GetLength()-nEnd);&lt;br /&gt;
	&lt;br /&gt;
	//stModulePath - содержит путь&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Как получить доступ к контролам на панели CReBar, принадлежащей классу MainFrame?===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;quot;MainFrm.h&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
//CMyApp - класс вашего приложения. theApp - глобальная переменная,&lt;br /&gt;
//поэтому для доступа к ней используем extern&lt;br /&gt;
extern CMyApp theApp;&lt;br /&gt;
&lt;br /&gt;
void CMyView::F()&lt;br /&gt;
{&lt;br /&gt;
	//Получаем главное окно приложения в любом месте программы&lt;br /&gt;
	CMainFrame* pMainFrame=(CMainFrame*)(theApp.m_pMainWnd);&lt;br /&gt;
	pMainFrame-&amp;gt;m_wndDlgBar ....//Делаем что хотим&lt;br /&gt;
	...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как загрузить и показать один из стандартных курсоров?===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HCURSOR hCursor;&lt;br /&gt;
hCursor=AfxGetApp()-&amp;gt;LoadStandardCursor(IDC_UPARROW);&lt;br /&gt;
if(hCursor)SetCursor(hCursor);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
идентификаторы стандартных курсоров:&lt;br /&gt;
IDC_ARROW&lt;br /&gt;
IDC_IBEAM&lt;br /&gt;
IDC_WAIT&lt;br /&gt;
IDC_CROSS&lt;br /&gt;
IDC_UPARROW&lt;br /&gt;
IDC_SIZENWSE&lt;br /&gt;
IDC_SIZENESW&lt;br /&gt;
IDC_SIZEWE&lt;br /&gt;
IDC_SIZENS&lt;br /&gt;
IDC_SIZEALL&lt;br /&gt;
===Как запретить пользователю закрыть программу нажатием на крестик?===&lt;br /&gt;
Нужно добавить обработчик сообщений WM_CLOSE - OnClose() - в главное окно программы. Для диалоговых приложений - это главный диалог, для одно- и много-документных - это CMainFrame.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void CMainFrame::OnClose()&lt;br /&gt;
{&lt;br /&gt;
	if(......)&lt;br /&gt;
	{&lt;br /&gt;
		//не разрешаем закрыть&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	CFrameWnd::OnClose();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Как создать на диалоге группу RadioButton-ов и как задать порядок их обхода клавишей Tab?===&lt;br /&gt;
Кладём на форму N контролов RadioButton. Затем у первого из группы ставим свойство Group, у остальных в группе - убираем это свойство. Порядок обхода (Tab Order) задаётся так: нажимаем Ctrl+D (загораются номера таб-порядка). Затем щёлкаем элементы в группе в таком порядке, который требуется.&lt;br /&gt;
&lt;br /&gt;
===Где лучше устанавливать начальные значения CComboBox?===&lt;br /&gt;
1) В визарде (новая строка данных - Ctrl+Enter)&lt;br /&gt;
&lt;br /&gt;
2) В функции OnInitDialog (для диалога) или OnInitialUpdate (для CView)&lt;br /&gt;
&lt;br /&gt;
===Как перевести RichEdit в режим замены символов?===&lt;br /&gt;
1) Программно, зная хендл контрола (hWnd):&lt;br /&gt;
&lt;br /&gt;
::PostMessage(hWnd,WM_KEYDOWN,VK_INSERT,1);&lt;br /&gt;
&lt;br /&gt;
2) Пользователь может нажать Insert.&lt;br /&gt;
&lt;br /&gt;
===Как вызвать метод класса CMainFrame (главное окно) из любого места программы?===&lt;br /&gt;
AfxGetApp()-&amp;gt;m_pMainWnd-&amp;gt; ... ;&lt;br /&gt;
===Как запретить появление полос прокруток на CFormView, когда пользователь делает размер главного окна меньше размера окна CFormView ?===&lt;br /&gt;
методом SetScaleToFitSize():&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void CMyView::OnInitialUpdate()&lt;br /&gt;
{&lt;br /&gt;
	CFormView::OnInitialUpdate();&lt;br /&gt;
	/////////&lt;br /&gt;
	GetParentFrame()-&amp;gt;RecalcLayout();&lt;br /&gt;
	ResizeParentToFit();&lt;br /&gt;
	SIZE s={0,0};&lt;br /&gt;
	SetScaleToFitSize(s);&lt;br /&gt;
	/////////&lt;br /&gt;
	...&lt;br /&gt;
	...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Как нарисовать прямоугольник с вертикальным цветовым градиентом?===&lt;br /&gt;
&lt;br /&gt;
pdc - указатель на контекст устройства&lt;br /&gt;
pSize - указатель на структуру SIZE с размером прямоугольника&lt;br /&gt;
dwdColor1, dwdColor2 - начальный и конечный цвет&lt;br /&gt;
bySteps - количество шагов градиента (1...255)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//вертикальный градиент&lt;br /&gt;
void sFillVertGradientRect(CDC* pdc,SIZE *pSize, COLORREF dwdColor1, COLORREF dwdColor2,BYTE bySteps)&lt;br /&gt;
{&lt;br /&gt;
	if(!bySteps)bySteps=1;&lt;br /&gt;
	WORD i;&lt;br /&gt;
	&lt;br /&gt;
	long W,H,x1,x2;&lt;br /&gt;
	BYTE R1,G1,B1,R2,G2,B2;&lt;br /&gt;
	float dh,dR,dG,dB,y1,y2,Rc,Gc,Bc;&lt;br /&gt;
	&lt;br /&gt;
	//ширина и высота&lt;br /&gt;
	W=pSize-&amp;gt;cx;&lt;br /&gt;
	H=pSize-&amp;gt;cy;&lt;br /&gt;
	&lt;br /&gt;
	//раскладываем цвета на их составляющие&lt;br /&gt;
	R1=(BYTE)((dwdColor1&amp;amp;0x000000ff));&lt;br /&gt;
	G1=(BYTE)((dwdColor1&amp;amp;0x0000ff00)&amp;gt;&amp;gt;8);&lt;br /&gt;
	B1=(BYTE)((dwdColor1&amp;amp;0x00ff0000)&amp;gt;&amp;gt;16);&lt;br /&gt;
	R2=(BYTE)((dwdColor2&amp;amp;0x000000ff));&lt;br /&gt;
	G2=(BYTE)((dwdColor2&amp;amp;0x0000ff00)&amp;gt;&amp;gt;8);&lt;br /&gt;
	B2=(BYTE)((dwdColor2&amp;amp;0x00ff0000)&amp;gt;&amp;gt;16);&lt;br /&gt;
	&lt;br /&gt;
	//высота разноцветных прямоугольников&lt;br /&gt;
	dh=((float)H)/((float)bySteps);&lt;br /&gt;
	//величина шагов составляющих цветов&lt;br /&gt;
	dR=(((float)R2)-((float)R1))/((float)bySteps);&lt;br /&gt;
	dG=(((float)G2)-((float)G1))/((float)bySteps);&lt;br /&gt;
	dB=(((float)B2)-((float)B1))/((float)bySteps);&lt;br /&gt;
	//выводим прямоугольники&lt;br /&gt;
	x1=0;x2=W;y1=0;y2=dh;&lt;br /&gt;
	Rc=R1;Gc=G1;Bc=B1;&lt;br /&gt;
	for(i=0;i&amp;lt;bySteps;i++)&lt;br /&gt;
	{&lt;br /&gt;
		//текущий цвет&lt;br /&gt;
		pdc-&amp;gt;FillSolidRect(x1,(int)y1,x2-x1,(int)(y2-y1),RGB((BYTE)Rc,(BYTE)Gc,(BYTE)Bc));&lt;br /&gt;
		//следующий цвет и координаты&lt;br /&gt;
		y1+=dh;y2+=dh;&lt;br /&gt;
		Rc+=dR;Gc+=dG;Bc+=dB;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
пример вызова:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	SIZE Size={100,100};&lt;br /&gt;
	sFillGradientRect(&amp;amp;dc,&amp;amp;Size, RGB(200,0,0), RGB(0,200,0),10);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Как под Windows отслеживать изменение файла?===&lt;br /&gt;
Использовать функции:&lt;br /&gt;
   FindFirstChangeNotification&lt;br /&gt;
   FindNextChangeNotification&lt;br /&gt;
   FindCloseChangeNotification&lt;br /&gt;
&lt;br /&gt;
===Есть массив char[], как конвертировать его в CString?===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	char buf[]=&amp;quot;text&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	//строка должна обязательно заканчиваться нулём.&lt;br /&gt;
	&lt;br /&gt;
	//конвертируем так&lt;br /&gt;
	CString txt(buf);&lt;br /&gt;
	&lt;br /&gt;
	//или так&lt;br /&gt;
	CString txt;&lt;br /&gt;
	txt=buf;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Как зарезервировать в CString буфер нужной длины?===&lt;br /&gt;
&lt;br /&gt;
при помощи методов класса:&lt;br /&gt;
   CString::GetBuffer&lt;br /&gt;
   и&lt;br /&gt;
   CString::GetBufferSetLength&lt;br /&gt;
&lt;br /&gt;
Разница между CString::GetBuffer(nLen) и CString::GetBufferSetLength(nLen) в том, что первый возвращает строку не меньше заданной длины, а второй возвращает строку точно равную заданной длине. Обе могут перераспределять память если надо. В обычных случаях лучше GetBuffer.&lt;br /&gt;
&lt;br /&gt;
Если содержимое буфера менялось, то после этого нужно вызвать CString::ReleaseBuffer с указанием новой длины. Значение -1 в вызове CString::ReleaseBuffer означает, что длина строки будет вычислена автоматом (функцией strlen) в методе.&amp;quot;-1&amp;quot; удобно использовать, если известно, что строка заканчивается нулем.&lt;br /&gt;
&lt;br /&gt;
===Как передать больше одного параметр в процедуру потока?===&lt;br /&gt;
&lt;br /&gt;
Определить структуру с указателями на всё любое,&lt;br /&gt;
например:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
struct mystr&lt;br /&gt;
{&lt;br /&gt;
	CEdit* pEd;&lt;br /&gt;
	CDialog* pDlg;&lt;br /&gt;
	DWORD* pdwd;&lt;br /&gt;
	int *pn;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
запуск потока:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mystr *pparam=new mystr;//экземпляр не должен быть временным!!!&lt;br /&gt;
memset(pparam,0,sizeof(*pparam));&lt;br /&gt;
pparam-&amp;gt;pEd=...;&lt;br /&gt;
pparam-&amp;gt;pdwd=...;&lt;br /&gt;
&lt;br /&gt;
::AfxBeginThread(thread,pparam); &lt;br /&gt;
//тут экземпляр *(pparam) уже нельзя использовать!!!&lt;br /&gt;
//он удалиться в потоке&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
в потоке:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//поток: &lt;br /&gt;
UINT threadLoader(LPVOID pParam) &lt;br /&gt;
{ &lt;br /&gt;
	mystr data=*((mystr*)pParam);&lt;br /&gt;
	delete ((mystr*)pParam);//подчищаем память&lt;br /&gt;
&lt;br /&gt;
	...&lt;br /&gt;
	data.pDlg-&amp;gt;...;&lt;br /&gt;
	(*data.pdwd)=...;&lt;br /&gt;
	...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как убрать главное меню из CMainFrame?===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT&amp;amp; cs)&lt;br /&gt;
{&lt;br /&gt;
	//обнуляем хендл меню до вызова CFrameWnd::PreCreateWindow&lt;br /&gt;
	cs.hMenu = 0;&lt;br /&gt;
	&lt;br /&gt;
	if( !CFrameWnd::PreCreateWindow(cs) )&lt;br /&gt;
	return FALSE;&lt;br /&gt;
	...&lt;br /&gt;
	...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Как работающая программа может определить, что юзер завершает работу Windows?===&lt;br /&gt;
В этот момент всем процессам посылается сообщение WM_QUERYENDSESSION - его и нужно отловить в обработчике OnQueryEndSession(). Если вернуть из обработчика значение 0, то Windows продолжит работу.&lt;br /&gt;
&lt;br /&gt;
===Как сделать всплывающую подсказку для класса CWnd и классов, от него производных?===&lt;br /&gt;
Допустим, имеется диалог класса CMyDlg. Делаем подсказки для контролов. (для CStatic контролов не забудьте поставить свойство Notify)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class CMyDlg:puplic CDialog&lt;br /&gt;
{&lt;br /&gt;
	CToolTipCtrl m_ToolTip;//мембер класса CMyDlg&lt;br /&gt;
	//&lt;br /&gt;
};&lt;br /&gt;
	&lt;br /&gt;
//массив, в котором перечислены идентификаторы&lt;br /&gt;
//контролов и тексты подсказок к ним&lt;br /&gt;
struct{int ID;const char* pch;} m_a_Tips[]=&lt;br /&gt;
{&lt;br /&gt;
	{IDC_BUTTON1,&amp;quot;КЫнопка&amp;quot;},&lt;br /&gt;
	{IDC_STATIC1,&amp;quot;Текст&amp;quot;},&lt;br /&gt;
	//&lt;br /&gt;
	{0,0},//признак конца массива&lt;br /&gt;
};&lt;br /&gt;
	&lt;br /&gt;
//в инициализации диалога (хотя, в принципе,&lt;br /&gt;
//можно и не тут) создаём и привязываем подсказки&lt;br /&gt;
BOOL CMyDlg::OnInitDialog() &lt;br /&gt;
{&lt;br /&gt;
	CDialog::OnInitDialog();&lt;br /&gt;
	//&lt;br /&gt;
	//создаём&lt;br /&gt;
	m_ToolTip.Create(this);&lt;br /&gt;
	//Привязка подсказок&lt;br /&gt;
	for(int i=0; m_a_Tips[i].ID; i++)&lt;br /&gt;
	{&lt;br /&gt;
		m_ToolTip.AddTool(&lt;br /&gt;
			GetDlgItem(m_a_Tips[i].ID),&lt;br /&gt;
			m_a_Tips[i].pch);&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	//включаем показ подсказок&lt;br /&gt;
	m_ToolTip.Activate(1);&lt;br /&gt;
	...&lt;br /&gt;
	...&lt;br /&gt;
}&lt;br /&gt;
	&lt;br /&gt;
//для того, чтобы подсказки отображались как реакция на движение&lt;br /&gt;
//курсора мыши, транслируем получаемые окнами сообщения в&lt;br /&gt;
//виртуальной PreTranslateMessage()&lt;br /&gt;
BOOL CMyDlg::PreTranslateMessage(MSG* pMsg) &lt;br /&gt;
{&lt;br /&gt;
	//транслируем&lt;br /&gt;
	if(m_ToolTip.m_hWnd)m_ToolTip.RelayEvent(pMsg);&lt;br /&gt;
	&lt;br /&gt;
	...&lt;br /&gt;
	...&lt;br /&gt;
	return CDialog::PreTranslateMessage(pMsg);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Как в отладчике VС просмотреть содержимое std::vector&amp;lt;string&amp;gt; V===&lt;br /&gt;
В режиме отладки открываем окно &amp;quot;Watch&amp;quot; (ALT+3) и вставляем выражения:&lt;br /&gt;
   &lt;br /&gt;
V._Myfirst      - будет показан первый элемент&lt;br /&gt;
V._Myfirst+1   - второй&lt;br /&gt;
V._Myfirst+2   - и т.д.&lt;br /&gt;
===Я вывожу на контекст устройства текст. Как определить в пикселах ширину и высоту выведенных символов текста?===&lt;br /&gt;
использовать процедуру API:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
BOOL GetTextExtentPoint32(&lt;br /&gt;
	HDC hdc,// хендл контекста&lt;br /&gt;
	LPCTSTR lpString,// выводимая строка&lt;br /&gt;
	int cbString,// длина строки в символах&lt;br /&gt;
	LPSIZE lpSize// указатель на структуру SIZE, куда &lt;br /&gt;
					//будут помещены размеры&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:FAQ]]&lt;/div&gt;</summary>
		<author><name>Mczim</name></author>	</entry>

	<entry>
		<id>https://wiki.shelek.ru/index.php?title=FAQ:WinAPI,_VCPP_Part_2&amp;diff=394</id>
		<title>FAQ:WinAPI, VCPP Part 2</title>
		<link rel="alternate" type="text/html" href="https://wiki.shelek.ru/index.php?title=FAQ:WinAPI,_VCPP_Part_2&amp;diff=394"/>
				<updated>2008-08-12T21:00:07Z</updated>
		
		<summary type="html">&lt;p&gt;Mczim: всплывающую подсказки &amp;gt; всплывающую подсказку&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Я создал простой проект DLL на VC++ 6.0. Все скомпилилось нормально. Но в другой программе не могу вызвать функцию из DLL - программа не может найти функцию по имени.===&lt;br /&gt;
В папке проекта нужно создать обычный файл txt и переименовать в&lt;br /&gt;
&amp;quot;имя_проекта_dll.DEF&amp;quot;&lt;br /&gt;
&lt;br /&gt;
В файле перечислить весь экспорт:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
EXPORTS&lt;br /&gt;
	MyFunctionName1&lt;br /&gt;
	MyFunctionName2&lt;br /&gt;
	MyFunctionName3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
И затем включить файл этот в дерево проекта.&lt;br /&gt;
===Есть ли какой-нибудь макрос в VC7, возвращающий строку вида ClassName::FunctionName внутри соответствующей функции?===&lt;br /&gt;
__FUNCSIG__&lt;br /&gt;
===Как динамически подгрузить ресурсы к ATL проекту?===&lt;br /&gt;
имеется класс&lt;br /&gt;
Код:&lt;br /&gt;
 class CComModule : public _ATL_MODULE&lt;br /&gt;
&lt;br /&gt;
в котором определена переменная m_hInstResource.&lt;br /&gt;
Нужно присвоить переменной значение хэндла Dll.&lt;br /&gt;
===Как динамически подгрузить ресурсы к MFC проекту?===&lt;br /&gt;
InitInstance() загружается Dll с ресурсами, затем вызывается&lt;br /&gt;
функция AfxSetResourceHandle c параметром - хэндлом этой dll.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
BOOL CMyApp::InitInstance()&lt;br /&gt;
{&lt;br /&gt;
	HINSTANCE hRes = NULL;&lt;br /&gt;
	hRes= LoadLibrary(&amp;quot;ResourceD.dll&amp;quot;);&lt;br /&gt;
	if(hRes)&lt;br /&gt;
	{&lt;br /&gt;
		AfxSetResourceHandle(hRes);&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	return CWinApp::InitInstance();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===возможно ли использование файлов чистого С и С++ в одном проекте? Если да, то каковы должны быть настройки компилятора? А то ругается на Unexpected end of file while looking for precompiled header directive.===&lt;br /&gt;
Компилятор распознает язык по расширению файла и устанавливает на весь файл.&lt;br /&gt;
Нельзя часть файла компилировать как С, а другую как С++. Для того, чтобы функции Си вызывать в С++, а функции С++ в Си, их надо декларировать для С++ как&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   extern &amp;quot;C&amp;quot;&lt;br /&gt;
	#ifdef __cplusplus&lt;br /&gt;
		extern &amp;quot;C&amp;quot;&lt;br /&gt;
		{&lt;br /&gt;
	#endif&lt;br /&gt;
	&lt;br /&gt;
		int func1(int );&lt;br /&gt;
		int func2(int );&lt;br /&gt;
		int func3(int );&lt;br /&gt;
	&lt;br /&gt;
	#ifdef __cplusplus&lt;br /&gt;
		}&lt;br /&gt;
	#endif&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Возможно, надо стереть *.pch файл и собрать снова.&lt;br /&gt;
&lt;br /&gt;
Также в настройках компилятора можно попробовать отключить&lt;br /&gt;
прекомпиленые хедеры для конкретного файла&lt;br /&gt;
   &amp;quot;C/С++&amp;quot;-&amp;gt;&amp;quot;Precompiled Header&amp;quot;&lt;br /&gt;
(правда перекомпиляция будет длится немного дольше)&lt;br /&gt;
&lt;br /&gt;
Или можно подключить в файлах stdafx.h (тогда не придется отключать use precompiled header )&lt;br /&gt;
&lt;br /&gt;
===где найти описание nmake для VC++6?===&lt;br /&gt;
В MSDN&lt;br /&gt;
http://msdn.microsoft.com/library/en-us/vcug98/html/_asug_overview.3a_.nmake_reference.asp&lt;br /&gt;
===Каким образом можно установить значение переменной для вызывающего процесса/потока из своей собственной DLL? Проблема заключается в том, что несмотря на то, что все линкуется нормально, значение переменной процесса не изменяется, когда я его устанавливаю вручную в библиотеке.===&lt;br /&gt;
Проблема вызвана тем, что каждая влинкованная libc (одна линкуется в&lt;br /&gt;
исполняемый файл, ещё одна в dll) содержит свою копию переменной.&lt;br /&gt;
&lt;br /&gt;
1) Можно воспользоваться динамически подгружаемой библиотекой С runtime.&lt;br /&gt;
Для этого приложение и dll надо компилировать с ключом /MD (или MDd для отладки).&lt;br /&gt;
В таком случае переменная будет общей для приложения и dll.&lt;br /&gt;
&lt;br /&gt;
2) Можно в основном модуле программы (тот, который станет .exe) сделать&lt;br /&gt;
&amp;quot;дырку&amp;quot; (backdoor), через которую присваивать переменной (int errno) значение:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
__declspec(dllexport) void set_errno(int code)&lt;br /&gt;
{&lt;br /&gt;
	errno = code;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
В dll при подключении к процессу надо извлечь из модуля программы указатель на эту функцию.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	typedef void (*SETINT)(int);&lt;br /&gt;
	SETINT g_set_errno=0;&lt;br /&gt;
	void set_errno_in_exe(int code)&lt;br /&gt;
	{&lt;br /&gt;
		if(g_set_errno) g_set_errno(code);&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved )&lt;br /&gt;
	{&lt;br /&gt;
		HANDLE hModule; // Handle to the main module&lt;br /&gt;
		if(fdwReason == DLL_PROCESS_ATTACH )&lt;br /&gt;
		{&lt;br /&gt;
			hModule = GetModuleHandle(NULL);&lt;br /&gt;
			if (hModule == NULL) return FALSE;&lt;br /&gt;
			g_set_errno = (SETINT) GetProcAddress(hModule, &amp;quot;set_errno&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
		return TRUE;&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
В нужном месте в dll вместо присваивания errno нужно вызывать внешнюю функцию&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void inside_dll_func()&lt;br /&gt;
{&lt;br /&gt;
	...&lt;br /&gt;
	...&lt;br /&gt;
	set_errno_in_exe(ERROR_CODE);&lt;br /&gt;
	...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Как закрасить фон окна CWnd?===&lt;br /&gt;
Нужно добавить обработчик сообщения WM_CTLCOLOR&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class CMyDialog : public CDialog&lt;br /&gt;
{&lt;br /&gt;
	//&lt;br /&gt;
	CBrush m_back_brush;&lt;br /&gt;
	...&lt;br /&gt;
	...&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
//конструктор&lt;br /&gt;
CMyDialog::CMyDialog(): CDialog(CMyDialog::IDD)&lt;br /&gt;
{&lt;br /&gt;
	//создаём кисть фона&lt;br /&gt;
	m_back_brush.CreateSolidBrush(RGB(192,186,207));&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HBRUSH CMyDialog::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) &lt;br /&gt;
{&lt;br /&gt;
	switch(nCtlColor)&lt;br /&gt;
	{&lt;br /&gt;
		//CStatic-контрол&lt;br /&gt;
		case WM_CTLCOLORSTATIC:&lt;br /&gt;
		{&lt;br /&gt;
			//у статиков делаем прозрачный фон&lt;br /&gt;
			pDC-&amp;gt;SetBkMode(TRANSPARENT);&lt;br /&gt;
			//и красный цвет текста&lt;br /&gt;
			pDC-&amp;gt;SetTextColor(RGB(255,0,0));&lt;br /&gt;
	&lt;br /&gt;
			//надо же что-то вернуть :)&lt;br /&gt;
			return (HBRUSH) (m_back_brush.m_hObject);&lt;br /&gt;
		}&lt;br /&gt;
		break;&lt;br /&gt;
	&lt;br /&gt;
		//диалог&lt;br /&gt;
		case WM_CTLCOLORDLG:&lt;br /&gt;
		{&lt;br /&gt;
			//возвращаем хендл кисти нужного фона&lt;br /&gt;
			return (HBRUSH) (m_back_brush.m_hObject);&lt;br /&gt;
		}&lt;br /&gt;
		break;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	//фон по умолчанию&lt;br /&gt;
	return CDialog::OnCtlColor(pDC, pWnd, nCtlColor);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Как определить , что курсор мыши вышел за границу окна?===&lt;br /&gt;
1) Использовать функцию _TrackMouseEvent. Например, есть класс MyST&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class MyST : public CStatic&lt;br /&gt;
{&lt;br /&gt;
	bool m_bTrackingNow;&lt;br /&gt;
	...&lt;br /&gt;
	...&lt;br /&gt;
};&lt;br /&gt;
	&lt;br /&gt;
//в конструкторе&lt;br /&gt;
MyST:MyST()&lt;br /&gt;
{&lt;br /&gt;
	 m_bTrackingNow=false;&lt;br /&gt;
}&lt;br /&gt;
	&lt;br /&gt;
//в обработчике OnMouseMove запускаем отслеживание&lt;br /&gt;
void MyST::OnMouseMove(UINT nFlags, CPoint point)&lt;br /&gt;
{&lt;br /&gt;
	if(!m_bTrackingNow)&lt;br /&gt;
	{&lt;br /&gt;
		m_bTrackingNow=true;&lt;br /&gt;
		TRACKMOUSEEVENT tme;&lt;br /&gt;
		tme.cbSize=sizeof(tme);&lt;br /&gt;
		tme.dwFlags=TME_LEAVE;//отслеживаем выход курсора&lt;br /&gt;
		tme.hwndTrack = m_hWnd;//из этого окна&lt;br /&gt;
	&lt;br /&gt;
		::_TrackMouseEvent(&amp;amp;tme);//&amp;quot;запуск&amp;quot; отслеживания&lt;br /&gt;
		//при выходе курсора за границу окна будет&lt;br /&gt;
		//будет сгенерировано сообщение WM_MOUSELEAVE&lt;br /&gt;
	}&lt;br /&gt;
	...&lt;br /&gt;
	...&lt;br /&gt;
	CStatic::OnMouseMove(nFlags,point);&lt;br /&gt;
}&lt;br /&gt;
	&lt;br /&gt;
//ловим сообщение WM_MOUSELEAVE, для этого&lt;br /&gt;
//переопределяем виртуальную PreTranslateMessage()&lt;br /&gt;
BOOL MyST::PreTranslateMessage(MSG* pMsg)&lt;br /&gt;
{&lt;br /&gt;
	if(pMsg-&amp;gt;message==WM_MOUSELEAVE)&lt;br /&gt;
	{&lt;br /&gt;
		//тут обрабатываем&lt;br /&gt;
		...&lt;br /&gt;
		...&lt;br /&gt;
		m_bTrackingNow=false;&lt;br /&gt;
	}&lt;br /&gt;
	...&lt;br /&gt;
	...&lt;br /&gt;
	return CStatic::PreTranslateMessage(pMsg);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
2) Для случая, когда надо регулировать время &amp;quot;реакции&amp;quot; на выход за границу&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
enum&lt;br /&gt;
{&lt;br /&gt;
	def_TrackTimer_ID		=	1000, //ID таймера&lt;br /&gt;
	def_TrackTimer_value	=	50, //миллисекунд&lt;br /&gt;
};&lt;br /&gt;
	&lt;br /&gt;
MyST::MyST()&lt;br /&gt;
{&lt;br /&gt;
	m_bTrackingNow=false;&lt;br /&gt;
}&lt;br /&gt;
	&lt;br /&gt;
//в обработчике OnMouseMove запускаем таймер&lt;br /&gt;
void MyST::OnMouseMove(UINT nFlags, CPoint point)&lt;br /&gt;
{&lt;br /&gt;
	//перезапуск таймера&lt;br /&gt;
	SetTimer(def_TrackTimer_ID,def_TrackTimer_value,0);&lt;br /&gt;
	m_bTrackingNow=true;&lt;br /&gt;
	...&lt;br /&gt;
	...&lt;br /&gt;
	CStatic::OnMouseMove(nFlags,point);&lt;br /&gt;
}&lt;br /&gt;
	&lt;br /&gt;
void MyST::OnTimer(UINT nIDEvent)&lt;br /&gt;
{&lt;br /&gt;
	if(nIDEvent==def_TrackTimer_ID)&lt;br /&gt;
	{&lt;br /&gt;
		KillTimer(def_TrackTimer_ID);//таймер гасит сам себя&lt;br /&gt;
		//смотрим, где курсор&lt;br /&gt;
		POINT pnt;&lt;br /&gt;
		if(GetCursorPos(&amp;amp;pnt))&lt;br /&gt;
		{&lt;br /&gt;
			if(WindowFromPoint(pnt)!=this)&lt;br /&gt;
			{&lt;br /&gt;
				m_bTrackingNow=false;//вышли за окно&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	CStatic::OnTimer(nIDEvent);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Когда размещаю компонент RichEdit на форму, программа запускается и тут же закрывается. Что здесь не так?===&lt;br /&gt;
Необходимо до начала использования контрола инициализировать работу с классом:&lt;br /&gt;
&lt;br /&gt;
для RichEdit необходимо вызвать функцию AfxInitRichEdit(),&lt;br /&gt;
для RichEdit2 - AfxInitRichEdit2().&lt;br /&gt;
&lt;br /&gt;
Вызывать надо в InitInstance() приложения (в случае для MFC).&lt;br /&gt;
===Как сделать обработчик сообщения для нескольких контролов сразу?===&lt;br /&gt;
Если без помощи визарда, то переопределить виртуальную OnCommand()&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
BOOL CMyDialog::OnCommand(WPARAM wParam, LPARAM lParam) &lt;br /&gt;
{&lt;br /&gt;
	WORD wMess=(wParam&amp;gt;&amp;gt;16);//командное сообщение&lt;br /&gt;
	int nID=(int)(wParam &amp;amp;0x0000ffff));//ID контрола&lt;br /&gt;
	HWND hW=(HWND)lParam;//хендл контрола&lt;br /&gt;
	&lt;br /&gt;
	//смотрим, какой контрол&lt;br /&gt;
	switch(nID)&lt;br /&gt;
	{&lt;br /&gt;
		//кнопки&lt;br /&gt;
		case ID_BN1:&lt;br /&gt;
		case ID_BN2:&lt;br /&gt;
		case ID_BN3:&lt;br /&gt;
		{&lt;br /&gt;
			//смотрим, какое сообщение&lt;br /&gt;
			switch(wMess)&lt;br /&gt;
			{&lt;br /&gt;
				case BN_CLICKED:{	...	}break;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		break;&lt;br /&gt;
	&lt;br /&gt;
		//едиты&lt;br /&gt;
		case ID_ED1:&lt;br /&gt;
		case ID_ED2:&lt;br /&gt;
		case ID_ED3:&lt;br /&gt;
		case ID_ED4:&lt;br /&gt;
		{&lt;br /&gt;
			//смотрим, какое сообщение&lt;br /&gt;
			switch(wMess)&lt;br /&gt;
			{&lt;br /&gt;
				case EN_CHANGE:{	...	}break;&lt;br /&gt;
				case EN_KILLFOCUS:{	...	}break;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		break;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	return CDialog::OnCommand(wParam, lParam);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Когда запускаю программу, то все надписи на русском языке теряются - показываются вопросики. Что делать?===&lt;br /&gt;
Лечится так: непосредственно после создания проекта открываем дерево ресурсов и в свойствах каждого элемента дерева ставим язык Russian. Если этого не сделать сразу, то все русские буквы при компиляции ресурсов потеряются.&lt;br /&gt;
&lt;br /&gt;
===Как в проекте VC6 MFC получить путь, откуда запущен ЕХЕ?===&lt;br /&gt;
Использовать GetModuleFileName():&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	TCHAR pszFileName[MAX_PATH];&lt;br /&gt;
	pszFileName[0]=0;&lt;br /&gt;
	GetModuleFileName(NULL, pszFileName, MAX_PATH);&lt;br /&gt;
	CString stModulePath =  pszFileName;&lt;br /&gt;
	//ищем первый слеш с конца и удаляем&lt;br /&gt;
	//его вместе с именем файла EXE&lt;br /&gt;
	int nEnd = stModulePath.ReverseFind('\\');&lt;br /&gt;
	stModulePath.Delete(nEnd, stModulePath.GetLength()-nEnd);&lt;br /&gt;
	&lt;br /&gt;
	//stModulePath - содержит путь&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Как получить доступ к контролам на панели CReBar, принадлежащей классу MainFrame?===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;quot;MainFrm.h&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
//CMyApp - класс вашего приложения. theApp - глобальная переменная,&lt;br /&gt;
//поэтому для доступа к ней используем extern&lt;br /&gt;
extern CMyApp theApp;&lt;br /&gt;
&lt;br /&gt;
void CMyView::F()&lt;br /&gt;
{&lt;br /&gt;
	//Получаем главное окно приложения в любом месте программы&lt;br /&gt;
	CMainFrame* pMainFrame=(CMainFrame*)(theApp.m_pMainWnd);&lt;br /&gt;
	pMainFrame-&amp;gt;m_wndDlgBar ....//Делаем что хотим&lt;br /&gt;
	...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как загрузить и показать один из стандартных курсоров?===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HCURSOR hCursor;&lt;br /&gt;
hCursor=AfxGetApp()-&amp;gt;LoadStandardCursor(IDC_UPARROW);&lt;br /&gt;
if(hCursor)SetCursor(hCursor);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
идентификаторы стандартных курсоров:&lt;br /&gt;
IDC_ARROW&lt;br /&gt;
IDC_IBEAM&lt;br /&gt;
IDC_WAIT&lt;br /&gt;
IDC_CROSS&lt;br /&gt;
IDC_UPARROW&lt;br /&gt;
IDC_SIZENWSE&lt;br /&gt;
IDC_SIZENESW&lt;br /&gt;
IDC_SIZEWE&lt;br /&gt;
IDC_SIZENS&lt;br /&gt;
IDC_SIZEALL&lt;br /&gt;
===Как запретить пользователю закрыть программу нажатием на крестик?===&lt;br /&gt;
Нужно добавить обработчик сообщений WM_CLOSE - OnClose() - в главное окно программы. Для диалоговых приложений - это главный диалог, для одно- и много-документных - это CMainFrame.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void CMainFrame::OnClose()&lt;br /&gt;
{&lt;br /&gt;
	if(......)&lt;br /&gt;
	{&lt;br /&gt;
		//не разрешаем закрыть&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	CFrameWnd::OnClose();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Как создать на диалоге группу RadioButton-ов и как задать порядок их обхода клавишей Tab?===&lt;br /&gt;
Кладём на форму N контролов RadioButton. Затем у первого из группы ставим свойство Group, у остальных в группе - убираем это свойство. Порядок обхода (Tab Order) задаётся так: нажимаем Ctrl+D (загораются номера таб-порядка). Затем щёлкаем элементы в группе в таком порядке, который требуется.&lt;br /&gt;
&lt;br /&gt;
===Где лучше устанавливать начальные значения CComboBox?===&lt;br /&gt;
1) В визарде (новая строка данных - Ctrl+Enter)&lt;br /&gt;
&lt;br /&gt;
2) В функции OnInitDialog (для диалога) или OnInitialUpdate (для CView)&lt;br /&gt;
&lt;br /&gt;
===Как перевести RichEdit в режим замены символов?===&lt;br /&gt;
1) Программно, зная хендл контрола (hWnd):&lt;br /&gt;
&lt;br /&gt;
::PostMessage(hWnd,WM_KEYDOWN,VK_INSERT,1);&lt;br /&gt;
&lt;br /&gt;
2) Пользователь может нажать Insert.&lt;br /&gt;
&lt;br /&gt;
===Как вызвать метод класса CMainFrame (главное окно) из любого места программы?===&lt;br /&gt;
AfxGetApp()-&amp;gt;m_pMainWnd-&amp;gt; ... ;&lt;br /&gt;
===Как запретить появление полос прокруток на CFormView, когда пользователь делает размер главного окна меньше размера окна CFormView ?===&lt;br /&gt;
методом SetScaleToFitSize():&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void CMyView::OnInitialUpdate()&lt;br /&gt;
{&lt;br /&gt;
	CFormView::OnInitialUpdate();&lt;br /&gt;
	/////////&lt;br /&gt;
	GetParentFrame()-&amp;gt;RecalcLayout();&lt;br /&gt;
	ResizeParentToFit();&lt;br /&gt;
	SIZE s={0,0};&lt;br /&gt;
	SetScaleToFitSize(s);&lt;br /&gt;
	/////////&lt;br /&gt;
	...&lt;br /&gt;
	...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Как нарисовать прямоугольник с вертикальным цветовым градиентом?===&lt;br /&gt;
&lt;br /&gt;
pdc - указатель на контекст устройства&lt;br /&gt;
pSize - указатель на структуру SIZE с размером прямоугольника&lt;br /&gt;
dwdColor1, dwdColor2 - начальный и конечный цвет&lt;br /&gt;
bySteps - количество шагов градиента (1...255)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//вертикальный градиент&lt;br /&gt;
void sFillVertGradientRect(CDC* pdc,SIZE *pSize, COLORREF dwdColor1, COLORREF dwdColor2,BYTE bySteps)&lt;br /&gt;
{&lt;br /&gt;
	if(!bySteps)bySteps=1;&lt;br /&gt;
	WORD i;&lt;br /&gt;
	&lt;br /&gt;
	long W,H,x1,x2;&lt;br /&gt;
	BYTE R1,G1,B1,R2,G2,B2;&lt;br /&gt;
	float dh,dR,dG,dB,y1,y2,Rc,Gc,Bc;&lt;br /&gt;
	&lt;br /&gt;
	//ширина и высота&lt;br /&gt;
	W=pSize-&amp;gt;cx;&lt;br /&gt;
	H=pSize-&amp;gt;cy;&lt;br /&gt;
	&lt;br /&gt;
	//раскладываем цвета на их составляющие&lt;br /&gt;
	R1=(BYTE)((dwdColor1&amp;amp;0x000000ff));&lt;br /&gt;
	G1=(BYTE)((dwdColor1&amp;amp;0x0000ff00)&amp;gt;&amp;gt;8);&lt;br /&gt;
	B1=(BYTE)((dwdColor1&amp;amp;0x00ff0000)&amp;gt;&amp;gt;16);&lt;br /&gt;
	R2=(BYTE)((dwdColor2&amp;amp;0x000000ff));&lt;br /&gt;
	G2=(BYTE)((dwdColor2&amp;amp;0x0000ff00)&amp;gt;&amp;gt;8);&lt;br /&gt;
	B2=(BYTE)((dwdColor2&amp;amp;0x00ff0000)&amp;gt;&amp;gt;16);&lt;br /&gt;
	&lt;br /&gt;
	//высота разноцветных прямоугольников&lt;br /&gt;
	dh=((float)H)/((float)bySteps);&lt;br /&gt;
	//величина шагов составляющих цветов&lt;br /&gt;
	dR=(((float)R2)-((float)R1))/((float)bySteps);&lt;br /&gt;
	dG=(((float)G2)-((float)G1))/((float)bySteps);&lt;br /&gt;
	dB=(((float)B2)-((float)B1))/((float)bySteps);&lt;br /&gt;
	//выводим прямоугольники&lt;br /&gt;
	x1=0;x2=W;y1=0;y2=dh;&lt;br /&gt;
	Rc=R1;Gc=G1;Bc=B1;&lt;br /&gt;
	for(i=0;i&amp;lt;bySteps;i++)&lt;br /&gt;
	{&lt;br /&gt;
		//текущий цвет&lt;br /&gt;
		pdc-&amp;gt;FillSolidRect(x1,(int)y1,x2-x1,(int)(y2-y1),RGB((BYTE)Rc,(BYTE)Gc,(BYTE)Bc));&lt;br /&gt;
		//следующий цвет и координаты&lt;br /&gt;
		y1+=dh;y2+=dh;&lt;br /&gt;
		Rc+=dR;Gc+=dG;Bc+=dB;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
пример вызова:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	SIZE Size={100,100};&lt;br /&gt;
	sFillGradientRect(&amp;amp;dc,&amp;amp;Size, RGB(200,0,0), RGB(0,200,0),10);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Как под Windows отслеживать изменение файла?===&lt;br /&gt;
Использовать функции:&lt;br /&gt;
   FindFirstChangeNotification&lt;br /&gt;
   FindNextChangeNotification&lt;br /&gt;
   FindCloseChangeNotification&lt;br /&gt;
&lt;br /&gt;
===Есть массив char[], как конвертировать его в CString?===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	char buf[]=&amp;quot;text&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	//строка должна обязательно заканчиваться нулём.&lt;br /&gt;
	&lt;br /&gt;
	//конвертируем так&lt;br /&gt;
	CString txt(buf);&lt;br /&gt;
	&lt;br /&gt;
	//или так&lt;br /&gt;
	CString txt;&lt;br /&gt;
	txt=buf;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Как зарезервировать в CString буфер нужной длины?===&lt;br /&gt;
&lt;br /&gt;
при помощи методов класса:&lt;br /&gt;
   CString::GetBuffer&lt;br /&gt;
   и&lt;br /&gt;
   CString::GetBufferSetLength&lt;br /&gt;
&lt;br /&gt;
Разница между CString::GetBuffer(nLen) и CString::GetBufferSetLength(nLen) в том, что первый возвращает строку не меньше заданной длины, а второй возвращает строку точно равную заданной длине. Обе могут перераспределять память если надо. В обычных случаях лучше GetBuffer.&lt;br /&gt;
&lt;br /&gt;
Если содержимое буфера менялось, то после этого нужно вызвать CString::ReleaseBuffer с указанием новой длины. Значение -1 в вызове CString::ReleaseBuffer означает, что длина строки будет вычислена автоматом (функцией strlen) в методе.&amp;quot;-1&amp;quot; удобно использовать, если известно, что строка заканчивается нулем.&lt;br /&gt;
&lt;br /&gt;
===Как передать больше одного параметр в процедуру потока?===&lt;br /&gt;
&lt;br /&gt;
Определить структуру с указателями на всё любое,&lt;br /&gt;
например:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
struct mystr&lt;br /&gt;
{&lt;br /&gt;
	CEdit* pEd;&lt;br /&gt;
	CDialog* pDlg;&lt;br /&gt;
	DWORD* pdwd;&lt;br /&gt;
	int *pn;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
запуск потока:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mystr *pparam=new mystr;//экземпляр не должен быть временным!!!&lt;br /&gt;
memset(pparam,0,sizeof(*pparam));&lt;br /&gt;
pparam-&amp;gt;pEd=...;&lt;br /&gt;
pparam-&amp;gt;pdwd=...;&lt;br /&gt;
&lt;br /&gt;
::AfxBeginThread(thread,pparam); &lt;br /&gt;
//тут экземпляр *(pparam) уже нельзя использовать!!!&lt;br /&gt;
//он удалиться в потоке&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
в потоке:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//поток: &lt;br /&gt;
UINT threadLoader(LPVOID pParam) &lt;br /&gt;
{ &lt;br /&gt;
	mystr data=*((mystr*)pParam);&lt;br /&gt;
	delete ((mystr*)pParam);//подчищаем память&lt;br /&gt;
&lt;br /&gt;
	...&lt;br /&gt;
	data.pDlg-&amp;gt;...;&lt;br /&gt;
	(*data.pdwd)=...;&lt;br /&gt;
	...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как убрать главное меню из CMainFrame?===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT&amp;amp; cs)&lt;br /&gt;
{&lt;br /&gt;
	//обнуляем хендл меню до вызова CFrameWnd::PreCreateWindow&lt;br /&gt;
	cs.hMenu = 0;&lt;br /&gt;
	&lt;br /&gt;
	if( !CFrameWnd::PreCreateWindow(cs) )&lt;br /&gt;
	return FALSE;&lt;br /&gt;
	...&lt;br /&gt;
	...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Как работающая программа может определить, что юзер завершает работу Windows?===&lt;br /&gt;
В этот момент всем процессам посылается сообщение WM_QUERYENDSESSION - его и нужно отловить в обработчике OnQueryEndSession(). Если вернуть из обработчика значение 0, то Windows продолжит работу.&lt;br /&gt;
&lt;br /&gt;
===Как сделать всплывающую подсказку для класса CWnd и классов, от него производных?===&lt;br /&gt;
Допустим, имеется диалог класса CMyDlg. Делаем подсказки для контролов. (для CStatic контролов не забудьте поставить свойство Notify)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class CMyDlg:puplic CDialog&lt;br /&gt;
{&lt;br /&gt;
	CToolTipCtrl m_ToolTip;//мембер класса CMyDlg&lt;br /&gt;
	//&lt;br /&gt;
};&lt;br /&gt;
	&lt;br /&gt;
//массив, в котором перечислены идентификаторы&lt;br /&gt;
//контролов и тексты подсказок к ним&lt;br /&gt;
struct{int ID;const char* pch;} m_a_Tips[]=&lt;br /&gt;
{&lt;br /&gt;
	{IDC_BUTTON1,&amp;quot;КЫнопка&amp;quot;},&lt;br /&gt;
	{IDC_STATIC1,&amp;quot;Текст&amp;quot;},&lt;br /&gt;
	//&lt;br /&gt;
	{0,0},//признак конца массива&lt;br /&gt;
};&lt;br /&gt;
	&lt;br /&gt;
//в инициализации диалога (хотя, в принципе,&lt;br /&gt;
//можно и не тут) создаём и привязываем подсказки&lt;br /&gt;
BOOL CMyDlg::OnInitDialog() &lt;br /&gt;
{&lt;br /&gt;
	CDialog::OnInitDialog();&lt;br /&gt;
	//&lt;br /&gt;
	//создаём&lt;br /&gt;
	m_ToolTip.Create(this);&lt;br /&gt;
	//Привязка подсказок&lt;br /&gt;
	for(int i=0; m_a_Tips[i].ID; i++)&lt;br /&gt;
	{&lt;br /&gt;
		m_ToolTip.AddTool(&lt;br /&gt;
			GetDlgItem(m_a_Tips[i].ID),&lt;br /&gt;
			m_a_Tips[i].pch);&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	//включаем показ подсказок&lt;br /&gt;
	m_ToolTip.Activate(1);&lt;br /&gt;
	...&lt;br /&gt;
	...&lt;br /&gt;
}&lt;br /&gt;
	&lt;br /&gt;
//для того, чтобы подсказки отображались как реакция на движение&lt;br /&gt;
//курсора мыши, транслируем получаемые окнами сообщения в&lt;br /&gt;
//виртуальной PreTranslateMessage()&lt;br /&gt;
BOOL CMyDlg::PreTranslateMessage(MSG* pMsg) &lt;br /&gt;
{&lt;br /&gt;
	//транслируем&lt;br /&gt;
	if(m_ToolTip.m_hWnd)m_ToolTip.RelayEvent(pMsg);&lt;br /&gt;
	&lt;br /&gt;
	...&lt;br /&gt;
	...&lt;br /&gt;
	return CDialog::PreTranslateMessage(pMsg);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Как в отладчике VС просмотреть содержимое std::vector&amp;lt;string&amp;gt; V===&lt;br /&gt;
В режиме отладки открываем окно &amp;quot;Watch&amp;quot; (ALT+3) и вставляем выражения:&lt;br /&gt;
   &lt;br /&gt;
V._Myfirst      - будет показан первый элемент&lt;br /&gt;
V._Myfirst+1   - второй&lt;br /&gt;
V._Myfirst+2   - и т.д.&lt;br /&gt;
===Я вывожу на контекст устройства текст. Как определить в пикселах ширину и высоту выведенных символов текста?===&lt;br /&gt;
использовать процедуру API&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
BOOL GetTextExtentPoint32(&lt;br /&gt;
	HDC hdc,// хендл контекста&lt;br /&gt;
	LPCTSTR lpString,// выводимая строка&lt;br /&gt;
	int cbString,// длина строки в символах&lt;br /&gt;
	LPSIZE lpSize// указатель на структуру SIZE, куда &lt;br /&gt;
					//будут помещены размеры&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:FAQ]]&lt;/div&gt;</summary>
		<author><name>Mczim</name></author>	</entry>

	<entry>
		<id>https://wiki.shelek.ru/index.php?title=FAQ:WinAPI,_VCPP_Part_2&amp;diff=393</id>
		<title>FAQ:WinAPI, VCPP Part 2</title>
		<link rel="alternate" type="text/html" href="https://wiki.shelek.ru/index.php?title=FAQ:WinAPI,_VCPP_Part_2&amp;diff=393"/>
				<updated>2008-08-12T20:58:47Z</updated>
		
		<summary type="html">&lt;p&gt;Mczim: пробел перед запятой в значение 0 , то Windows&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Я создал простой проект DLL на VC++ 6.0. Все скомпилилось нормально. Но в другой программе не могу вызвать функцию из DLL - программа не может найти функцию по имени.===&lt;br /&gt;
В папке проекта нужно создать обычный файл txt и переименовать в&lt;br /&gt;
&amp;quot;имя_проекта_dll.DEF&amp;quot;&lt;br /&gt;
&lt;br /&gt;
В файле перечислить весь экспорт:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
EXPORTS&lt;br /&gt;
	MyFunctionName1&lt;br /&gt;
	MyFunctionName2&lt;br /&gt;
	MyFunctionName3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
И затем включить файл этот в дерево проекта.&lt;br /&gt;
===Есть ли какой-нибудь макрос в VC7, возвращающий строку вида ClassName::FunctionName внутри соответствующей функции?===&lt;br /&gt;
__FUNCSIG__&lt;br /&gt;
===Как динамически подгрузить ресурсы к ATL проекту?===&lt;br /&gt;
имеется класс&lt;br /&gt;
Код:&lt;br /&gt;
 class CComModule : public _ATL_MODULE&lt;br /&gt;
&lt;br /&gt;
в котором определена переменная m_hInstResource.&lt;br /&gt;
Нужно присвоить переменной значение хэндла Dll.&lt;br /&gt;
===Как динамически подгрузить ресурсы к MFC проекту?===&lt;br /&gt;
InitInstance() загружается Dll с ресурсами, затем вызывается&lt;br /&gt;
функция AfxSetResourceHandle c параметром - хэндлом этой dll.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
BOOL CMyApp::InitInstance()&lt;br /&gt;
{&lt;br /&gt;
	HINSTANCE hRes = NULL;&lt;br /&gt;
	hRes= LoadLibrary(&amp;quot;ResourceD.dll&amp;quot;);&lt;br /&gt;
	if(hRes)&lt;br /&gt;
	{&lt;br /&gt;
		AfxSetResourceHandle(hRes);&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	return CWinApp::InitInstance();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===возможно ли использование файлов чистого С и С++ в одном проекте? Если да, то каковы должны быть настройки компилятора? А то ругается на Unexpected end of file while looking for precompiled header directive.===&lt;br /&gt;
Компилятор распознает язык по расширению файла и устанавливает на весь файл.&lt;br /&gt;
Нельзя часть файла компилировать как С, а другую как С++. Для того, чтобы функции Си вызывать в С++, а функции С++ в Си, их надо декларировать для С++ как&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   extern &amp;quot;C&amp;quot;&lt;br /&gt;
	#ifdef __cplusplus&lt;br /&gt;
		extern &amp;quot;C&amp;quot;&lt;br /&gt;
		{&lt;br /&gt;
	#endif&lt;br /&gt;
	&lt;br /&gt;
		int func1(int );&lt;br /&gt;
		int func2(int );&lt;br /&gt;
		int func3(int );&lt;br /&gt;
	&lt;br /&gt;
	#ifdef __cplusplus&lt;br /&gt;
		}&lt;br /&gt;
	#endif&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Возможно, надо стереть *.pch файл и собрать снова.&lt;br /&gt;
&lt;br /&gt;
Также в настройках компилятора можно попробовать отключить&lt;br /&gt;
прекомпиленые хедеры для конкретного файла&lt;br /&gt;
   &amp;quot;C/С++&amp;quot;-&amp;gt;&amp;quot;Precompiled Header&amp;quot;&lt;br /&gt;
(правда перекомпиляция будет длится немного дольше)&lt;br /&gt;
&lt;br /&gt;
Или можно подключить в файлах stdafx.h (тогда не придется отключать use precompiled header )&lt;br /&gt;
&lt;br /&gt;
===где найти описание nmake для VC++6?===&lt;br /&gt;
В MSDN&lt;br /&gt;
http://msdn.microsoft.com/library/en-us/vcug98/html/_asug_overview.3a_.nmake_reference.asp&lt;br /&gt;
===Каким образом можно установить значение переменной для вызывающего процесса/потока из своей собственной DLL? Проблема заключается в том, что несмотря на то, что все линкуется нормально, значение переменной процесса не изменяется, когда я его устанавливаю вручную в библиотеке.===&lt;br /&gt;
Проблема вызвана тем, что каждая влинкованная libc (одна линкуется в&lt;br /&gt;
исполняемый файл, ещё одна в dll) содержит свою копию переменной.&lt;br /&gt;
&lt;br /&gt;
1) Можно воспользоваться динамически подгружаемой библиотекой С runtime.&lt;br /&gt;
Для этого приложение и dll надо компилировать с ключом /MD (или MDd для отладки).&lt;br /&gt;
В таком случае переменная будет общей для приложения и dll.&lt;br /&gt;
&lt;br /&gt;
2) Можно в основном модуле программы (тот, который станет .exe) сделать&lt;br /&gt;
&amp;quot;дырку&amp;quot; (backdoor), через которую присваивать переменной (int errno) значение:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
__declspec(dllexport) void set_errno(int code)&lt;br /&gt;
{&lt;br /&gt;
	errno = code;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
В dll при подключении к процессу надо извлечь из модуля программы указатель на эту функцию.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	typedef void (*SETINT)(int);&lt;br /&gt;
	SETINT g_set_errno=0;&lt;br /&gt;
	void set_errno_in_exe(int code)&lt;br /&gt;
	{&lt;br /&gt;
		if(g_set_errno) g_set_errno(code);&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved )&lt;br /&gt;
	{&lt;br /&gt;
		HANDLE hModule; // Handle to the main module&lt;br /&gt;
		if(fdwReason == DLL_PROCESS_ATTACH )&lt;br /&gt;
		{&lt;br /&gt;
			hModule = GetModuleHandle(NULL);&lt;br /&gt;
			if (hModule == NULL) return FALSE;&lt;br /&gt;
			g_set_errno = (SETINT) GetProcAddress(hModule, &amp;quot;set_errno&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
		return TRUE;&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
В нужном месте в dll вместо присваивания errno нужно вызывать внешнюю функцию&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void inside_dll_func()&lt;br /&gt;
{&lt;br /&gt;
	...&lt;br /&gt;
	...&lt;br /&gt;
	set_errno_in_exe(ERROR_CODE);&lt;br /&gt;
	...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Как закрасить фон окна CWnd?===&lt;br /&gt;
Нужно добавить обработчик сообщения WM_CTLCOLOR&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class CMyDialog : public CDialog&lt;br /&gt;
{&lt;br /&gt;
	//&lt;br /&gt;
	CBrush m_back_brush;&lt;br /&gt;
	...&lt;br /&gt;
	...&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
//конструктор&lt;br /&gt;
CMyDialog::CMyDialog(): CDialog(CMyDialog::IDD)&lt;br /&gt;
{&lt;br /&gt;
	//создаём кисть фона&lt;br /&gt;
	m_back_brush.CreateSolidBrush(RGB(192,186,207));&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HBRUSH CMyDialog::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) &lt;br /&gt;
{&lt;br /&gt;
	switch(nCtlColor)&lt;br /&gt;
	{&lt;br /&gt;
		//CStatic-контрол&lt;br /&gt;
		case WM_CTLCOLORSTATIC:&lt;br /&gt;
		{&lt;br /&gt;
			//у статиков делаем прозрачный фон&lt;br /&gt;
			pDC-&amp;gt;SetBkMode(TRANSPARENT);&lt;br /&gt;
			//и красный цвет текста&lt;br /&gt;
			pDC-&amp;gt;SetTextColor(RGB(255,0,0));&lt;br /&gt;
	&lt;br /&gt;
			//надо же что-то вернуть :)&lt;br /&gt;
			return (HBRUSH) (m_back_brush.m_hObject);&lt;br /&gt;
		}&lt;br /&gt;
		break;&lt;br /&gt;
	&lt;br /&gt;
		//диалог&lt;br /&gt;
		case WM_CTLCOLORDLG:&lt;br /&gt;
		{&lt;br /&gt;
			//возвращаем хендл кисти нужного фона&lt;br /&gt;
			return (HBRUSH) (m_back_brush.m_hObject);&lt;br /&gt;
		}&lt;br /&gt;
		break;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	//фон по умолчанию&lt;br /&gt;
	return CDialog::OnCtlColor(pDC, pWnd, nCtlColor);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Как определить , что курсор мыши вышел за границу окна?===&lt;br /&gt;
1) Использовать функцию _TrackMouseEvent. Например, есть класс MyST&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class MyST : public CStatic&lt;br /&gt;
{&lt;br /&gt;
	bool m_bTrackingNow;&lt;br /&gt;
	...&lt;br /&gt;
	...&lt;br /&gt;
};&lt;br /&gt;
	&lt;br /&gt;
//в конструкторе&lt;br /&gt;
MyST:MyST()&lt;br /&gt;
{&lt;br /&gt;
	 m_bTrackingNow=false;&lt;br /&gt;
}&lt;br /&gt;
	&lt;br /&gt;
//в обработчике OnMouseMove запускаем отслеживание&lt;br /&gt;
void MyST::OnMouseMove(UINT nFlags, CPoint point)&lt;br /&gt;
{&lt;br /&gt;
	if(!m_bTrackingNow)&lt;br /&gt;
	{&lt;br /&gt;
		m_bTrackingNow=true;&lt;br /&gt;
		TRACKMOUSEEVENT tme;&lt;br /&gt;
		tme.cbSize=sizeof(tme);&lt;br /&gt;
		tme.dwFlags=TME_LEAVE;//отслеживаем выход курсора&lt;br /&gt;
		tme.hwndTrack = m_hWnd;//из этого окна&lt;br /&gt;
	&lt;br /&gt;
		::_TrackMouseEvent(&amp;amp;tme);//&amp;quot;запуск&amp;quot; отслеживания&lt;br /&gt;
		//при выходе курсора за границу окна будет&lt;br /&gt;
		//будет сгенерировано сообщение WM_MOUSELEAVE&lt;br /&gt;
	}&lt;br /&gt;
	...&lt;br /&gt;
	...&lt;br /&gt;
	CStatic::OnMouseMove(nFlags,point);&lt;br /&gt;
}&lt;br /&gt;
	&lt;br /&gt;
//ловим сообщение WM_MOUSELEAVE, для этого&lt;br /&gt;
//переопределяем виртуальную PreTranslateMessage()&lt;br /&gt;
BOOL MyST::PreTranslateMessage(MSG* pMsg)&lt;br /&gt;
{&lt;br /&gt;
	if(pMsg-&amp;gt;message==WM_MOUSELEAVE)&lt;br /&gt;
	{&lt;br /&gt;
		//тут обрабатываем&lt;br /&gt;
		...&lt;br /&gt;
		...&lt;br /&gt;
		m_bTrackingNow=false;&lt;br /&gt;
	}&lt;br /&gt;
	...&lt;br /&gt;
	...&lt;br /&gt;
	return CStatic::PreTranslateMessage(pMsg);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
2) Для случая, когда надо регулировать время &amp;quot;реакции&amp;quot; на выход за границу&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
enum&lt;br /&gt;
{&lt;br /&gt;
	def_TrackTimer_ID		=	1000, //ID таймера&lt;br /&gt;
	def_TrackTimer_value	=	50, //миллисекунд&lt;br /&gt;
};&lt;br /&gt;
	&lt;br /&gt;
MyST::MyST()&lt;br /&gt;
{&lt;br /&gt;
	m_bTrackingNow=false;&lt;br /&gt;
}&lt;br /&gt;
	&lt;br /&gt;
//в обработчике OnMouseMove запускаем таймер&lt;br /&gt;
void MyST::OnMouseMove(UINT nFlags, CPoint point)&lt;br /&gt;
{&lt;br /&gt;
	//перезапуск таймера&lt;br /&gt;
	SetTimer(def_TrackTimer_ID,def_TrackTimer_value,0);&lt;br /&gt;
	m_bTrackingNow=true;&lt;br /&gt;
	...&lt;br /&gt;
	...&lt;br /&gt;
	CStatic::OnMouseMove(nFlags,point);&lt;br /&gt;
}&lt;br /&gt;
	&lt;br /&gt;
void MyST::OnTimer(UINT nIDEvent)&lt;br /&gt;
{&lt;br /&gt;
	if(nIDEvent==def_TrackTimer_ID)&lt;br /&gt;
	{&lt;br /&gt;
		KillTimer(def_TrackTimer_ID);//таймер гасит сам себя&lt;br /&gt;
		//смотрим, где курсор&lt;br /&gt;
		POINT pnt;&lt;br /&gt;
		if(GetCursorPos(&amp;amp;pnt))&lt;br /&gt;
		{&lt;br /&gt;
			if(WindowFromPoint(pnt)!=this)&lt;br /&gt;
			{&lt;br /&gt;
				m_bTrackingNow=false;//вышли за окно&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	CStatic::OnTimer(nIDEvent);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Когда размещаю компонент RichEdit на форму, программа запускается и тут же закрывается. Что здесь не так?===&lt;br /&gt;
Необходимо до начала использования контрола инициализировать работу с классом:&lt;br /&gt;
&lt;br /&gt;
для RichEdit необходимо вызвать функцию AfxInitRichEdit(),&lt;br /&gt;
для RichEdit2 - AfxInitRichEdit2().&lt;br /&gt;
&lt;br /&gt;
Вызывать надо в InitInstance() приложения (в случае для MFC).&lt;br /&gt;
===Как сделать обработчик сообщения для нескольких контролов сразу?===&lt;br /&gt;
Если без помощи визарда, то переопределить виртуальную OnCommand()&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
BOOL CMyDialog::OnCommand(WPARAM wParam, LPARAM lParam) &lt;br /&gt;
{&lt;br /&gt;
	WORD wMess=(wParam&amp;gt;&amp;gt;16);//командное сообщение&lt;br /&gt;
	int nID=(int)(wParam &amp;amp;0x0000ffff));//ID контрола&lt;br /&gt;
	HWND hW=(HWND)lParam;//хендл контрола&lt;br /&gt;
	&lt;br /&gt;
	//смотрим, какой контрол&lt;br /&gt;
	switch(nID)&lt;br /&gt;
	{&lt;br /&gt;
		//кнопки&lt;br /&gt;
		case ID_BN1:&lt;br /&gt;
		case ID_BN2:&lt;br /&gt;
		case ID_BN3:&lt;br /&gt;
		{&lt;br /&gt;
			//смотрим, какое сообщение&lt;br /&gt;
			switch(wMess)&lt;br /&gt;
			{&lt;br /&gt;
				case BN_CLICKED:{	...	}break;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		break;&lt;br /&gt;
	&lt;br /&gt;
		//едиты&lt;br /&gt;
		case ID_ED1:&lt;br /&gt;
		case ID_ED2:&lt;br /&gt;
		case ID_ED3:&lt;br /&gt;
		case ID_ED4:&lt;br /&gt;
		{&lt;br /&gt;
			//смотрим, какое сообщение&lt;br /&gt;
			switch(wMess)&lt;br /&gt;
			{&lt;br /&gt;
				case EN_CHANGE:{	...	}break;&lt;br /&gt;
				case EN_KILLFOCUS:{	...	}break;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		break;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	return CDialog::OnCommand(wParam, lParam);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Когда запускаю программу, то все надписи на русском языке теряются - показываются вопросики. Что делать?===&lt;br /&gt;
Лечится так: непосредственно после создания проекта открываем дерево ресурсов и в свойствах каждого элемента дерева ставим язык Russian. Если этого не сделать сразу, то все русские буквы при компиляции ресурсов потеряются.&lt;br /&gt;
&lt;br /&gt;
===Как в проекте VC6 MFC получить путь, откуда запущен ЕХЕ?===&lt;br /&gt;
Использовать GetModuleFileName():&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	TCHAR pszFileName[MAX_PATH];&lt;br /&gt;
	pszFileName[0]=0;&lt;br /&gt;
	GetModuleFileName(NULL, pszFileName, MAX_PATH);&lt;br /&gt;
	CString stModulePath =  pszFileName;&lt;br /&gt;
	//ищем первый слеш с конца и удаляем&lt;br /&gt;
	//его вместе с именем файла EXE&lt;br /&gt;
	int nEnd = stModulePath.ReverseFind('\\');&lt;br /&gt;
	stModulePath.Delete(nEnd, stModulePath.GetLength()-nEnd);&lt;br /&gt;
	&lt;br /&gt;
	//stModulePath - содержит путь&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Как получить доступ к контролам на панели CReBar, принадлежащей классу MainFrame?===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;quot;MainFrm.h&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
//CMyApp - класс вашего приложения. theApp - глобальная переменная,&lt;br /&gt;
//поэтому для доступа к ней используем extern&lt;br /&gt;
extern CMyApp theApp;&lt;br /&gt;
&lt;br /&gt;
void CMyView::F()&lt;br /&gt;
{&lt;br /&gt;
	//Получаем главное окно приложения в любом месте программы&lt;br /&gt;
	CMainFrame* pMainFrame=(CMainFrame*)(theApp.m_pMainWnd);&lt;br /&gt;
	pMainFrame-&amp;gt;m_wndDlgBar ....//Делаем что хотим&lt;br /&gt;
	...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как загрузить и показать один из стандартных курсоров?===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HCURSOR hCursor;&lt;br /&gt;
hCursor=AfxGetApp()-&amp;gt;LoadStandardCursor(IDC_UPARROW);&lt;br /&gt;
if(hCursor)SetCursor(hCursor);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
идентификаторы стандартных курсоров:&lt;br /&gt;
IDC_ARROW&lt;br /&gt;
IDC_IBEAM&lt;br /&gt;
IDC_WAIT&lt;br /&gt;
IDC_CROSS&lt;br /&gt;
IDC_UPARROW&lt;br /&gt;
IDC_SIZENWSE&lt;br /&gt;
IDC_SIZENESW&lt;br /&gt;
IDC_SIZEWE&lt;br /&gt;
IDC_SIZENS&lt;br /&gt;
IDC_SIZEALL&lt;br /&gt;
===Как запретить пользователю закрыть программу нажатием на крестик?===&lt;br /&gt;
Нужно добавить обработчик сообщений WM_CLOSE - OnClose() - в главное окно программы. Для диалоговых приложений - это главный диалог, для одно- и много-документных - это CMainFrame.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void CMainFrame::OnClose()&lt;br /&gt;
{&lt;br /&gt;
	if(......)&lt;br /&gt;
	{&lt;br /&gt;
		//не разрешаем закрыть&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	CFrameWnd::OnClose();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Как создать на диалоге группу RadioButton-ов и как задать порядок их обхода клавишей Tab?===&lt;br /&gt;
Кладём на форму N контролов RadioButton. Затем у первого из группы ставим свойство Group, у остальных в группе - убираем это свойство. Порядок обхода (Tab Order) задаётся так: нажимаем Ctrl+D (загораются номера таб-порядка). Затем щёлкаем элементы в группе в таком порядке, который требуется.&lt;br /&gt;
&lt;br /&gt;
===Где лучше устанавливать начальные значения CComboBox?===&lt;br /&gt;
1) В визарде (новая строка данных - Ctrl+Enter)&lt;br /&gt;
&lt;br /&gt;
2) В функции OnInitDialog (для диалога) или OnInitialUpdate (для CView)&lt;br /&gt;
&lt;br /&gt;
===Как перевести RichEdit в режим замены символов?===&lt;br /&gt;
1) Программно, зная хендл контрола (hWnd):&lt;br /&gt;
&lt;br /&gt;
::PostMessage(hWnd,WM_KEYDOWN,VK_INSERT,1);&lt;br /&gt;
&lt;br /&gt;
2) Пользователь может нажать Insert.&lt;br /&gt;
&lt;br /&gt;
===Как вызвать метод класса CMainFrame (главное окно) из любого места программы?===&lt;br /&gt;
AfxGetApp()-&amp;gt;m_pMainWnd-&amp;gt; ... ;&lt;br /&gt;
===Как запретить появление полос прокруток на CFormView, когда пользователь делает размер главного окна меньше размера окна CFormView ?===&lt;br /&gt;
методом SetScaleToFitSize():&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void CMyView::OnInitialUpdate()&lt;br /&gt;
{&lt;br /&gt;
	CFormView::OnInitialUpdate();&lt;br /&gt;
	/////////&lt;br /&gt;
	GetParentFrame()-&amp;gt;RecalcLayout();&lt;br /&gt;
	ResizeParentToFit();&lt;br /&gt;
	SIZE s={0,0};&lt;br /&gt;
	SetScaleToFitSize(s);&lt;br /&gt;
	/////////&lt;br /&gt;
	...&lt;br /&gt;
	...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Как нарисовать прямоугольник с вертикальным цветовым градиентом?===&lt;br /&gt;
&lt;br /&gt;
pdc - указатель на контекст устройства&lt;br /&gt;
pSize - указатель на структуру SIZE с размером прямоугольника&lt;br /&gt;
dwdColor1, dwdColor2 - начальный и конечный цвет&lt;br /&gt;
bySteps - количество шагов градиента (1...255)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//вертикальный градиент&lt;br /&gt;
void sFillVertGradientRect(CDC* pdc,SIZE *pSize, COLORREF dwdColor1, COLORREF dwdColor2,BYTE bySteps)&lt;br /&gt;
{&lt;br /&gt;
	if(!bySteps)bySteps=1;&lt;br /&gt;
	WORD i;&lt;br /&gt;
	&lt;br /&gt;
	long W,H,x1,x2;&lt;br /&gt;
	BYTE R1,G1,B1,R2,G2,B2;&lt;br /&gt;
	float dh,dR,dG,dB,y1,y2,Rc,Gc,Bc;&lt;br /&gt;
	&lt;br /&gt;
	//ширина и высота&lt;br /&gt;
	W=pSize-&amp;gt;cx;&lt;br /&gt;
	H=pSize-&amp;gt;cy;&lt;br /&gt;
	&lt;br /&gt;
	//раскладываем цвета на их составляющие&lt;br /&gt;
	R1=(BYTE)((dwdColor1&amp;amp;0x000000ff));&lt;br /&gt;
	G1=(BYTE)((dwdColor1&amp;amp;0x0000ff00)&amp;gt;&amp;gt;8);&lt;br /&gt;
	B1=(BYTE)((dwdColor1&amp;amp;0x00ff0000)&amp;gt;&amp;gt;16);&lt;br /&gt;
	R2=(BYTE)((dwdColor2&amp;amp;0x000000ff));&lt;br /&gt;
	G2=(BYTE)((dwdColor2&amp;amp;0x0000ff00)&amp;gt;&amp;gt;8);&lt;br /&gt;
	B2=(BYTE)((dwdColor2&amp;amp;0x00ff0000)&amp;gt;&amp;gt;16);&lt;br /&gt;
	&lt;br /&gt;
	//высота разноцветных прямоугольников&lt;br /&gt;
	dh=((float)H)/((float)bySteps);&lt;br /&gt;
	//величина шагов составляющих цветов&lt;br /&gt;
	dR=(((float)R2)-((float)R1))/((float)bySteps);&lt;br /&gt;
	dG=(((float)G2)-((float)G1))/((float)bySteps);&lt;br /&gt;
	dB=(((float)B2)-((float)B1))/((float)bySteps);&lt;br /&gt;
	//выводим прямоугольники&lt;br /&gt;
	x1=0;x2=W;y1=0;y2=dh;&lt;br /&gt;
	Rc=R1;Gc=G1;Bc=B1;&lt;br /&gt;
	for(i=0;i&amp;lt;bySteps;i++)&lt;br /&gt;
	{&lt;br /&gt;
		//текущий цвет&lt;br /&gt;
		pdc-&amp;gt;FillSolidRect(x1,(int)y1,x2-x1,(int)(y2-y1),RGB((BYTE)Rc,(BYTE)Gc,(BYTE)Bc));&lt;br /&gt;
		//следующий цвет и координаты&lt;br /&gt;
		y1+=dh;y2+=dh;&lt;br /&gt;
		Rc+=dR;Gc+=dG;Bc+=dB;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
пример вызова:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	SIZE Size={100,100};&lt;br /&gt;
	sFillGradientRect(&amp;amp;dc,&amp;amp;Size, RGB(200,0,0), RGB(0,200,0),10);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Как под Windows отслеживать изменение файла?===&lt;br /&gt;
Использовать функции:&lt;br /&gt;
   FindFirstChangeNotification&lt;br /&gt;
   FindNextChangeNotification&lt;br /&gt;
   FindCloseChangeNotification&lt;br /&gt;
&lt;br /&gt;
===Есть массив char[], как конвертировать его в CString?===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	char buf[]=&amp;quot;text&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	//строка должна обязательно заканчиваться нулём.&lt;br /&gt;
	&lt;br /&gt;
	//конвертируем так&lt;br /&gt;
	CString txt(buf);&lt;br /&gt;
	&lt;br /&gt;
	//или так&lt;br /&gt;
	CString txt;&lt;br /&gt;
	txt=buf;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Как зарезервировать в CString буфер нужной длины?===&lt;br /&gt;
&lt;br /&gt;
при помощи методов класса:&lt;br /&gt;
   CString::GetBuffer&lt;br /&gt;
   и&lt;br /&gt;
   CString::GetBufferSetLength&lt;br /&gt;
&lt;br /&gt;
Разница между CString::GetBuffer(nLen) и CString::GetBufferSetLength(nLen) в том, что первый возвращает строку не меньше заданной длины, а второй возвращает строку точно равную заданной длине. Обе могут перераспределять память если надо. В обычных случаях лучше GetBuffer.&lt;br /&gt;
&lt;br /&gt;
Если содержимое буфера менялось, то после этого нужно вызвать CString::ReleaseBuffer с указанием новой длины. Значение -1 в вызове CString::ReleaseBuffer означает, что длина строки будет вычислена автоматом (функцией strlen) в методе.&amp;quot;-1&amp;quot; удобно использовать, если известно, что строка заканчивается нулем.&lt;br /&gt;
&lt;br /&gt;
===Как передать больше одного параметр в процедуру потока?===&lt;br /&gt;
&lt;br /&gt;
Определить структуру с указателями на всё любое,&lt;br /&gt;
например:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
struct mystr&lt;br /&gt;
{&lt;br /&gt;
	CEdit* pEd;&lt;br /&gt;
	CDialog* pDlg;&lt;br /&gt;
	DWORD* pdwd;&lt;br /&gt;
	int *pn;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
запуск потока:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mystr *pparam=new mystr;//экземпляр не должен быть временным!!!&lt;br /&gt;
memset(pparam,0,sizeof(*pparam));&lt;br /&gt;
pparam-&amp;gt;pEd=...;&lt;br /&gt;
pparam-&amp;gt;pdwd=...;&lt;br /&gt;
&lt;br /&gt;
::AfxBeginThread(thread,pparam); &lt;br /&gt;
//тут экземпляр *(pparam) уже нельзя использовать!!!&lt;br /&gt;
//он удалиться в потоке&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
в потоке:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//поток: &lt;br /&gt;
UINT threadLoader(LPVOID pParam) &lt;br /&gt;
{ &lt;br /&gt;
	mystr data=*((mystr*)pParam);&lt;br /&gt;
	delete ((mystr*)pParam);//подчищаем память&lt;br /&gt;
&lt;br /&gt;
	...&lt;br /&gt;
	data.pDlg-&amp;gt;...;&lt;br /&gt;
	(*data.pdwd)=...;&lt;br /&gt;
	...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как убрать главное меню из CMainFrame?===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT&amp;amp; cs)&lt;br /&gt;
{&lt;br /&gt;
	//обнуляем хендл меню до вызова CFrameWnd::PreCreateWindow&lt;br /&gt;
	cs.hMenu = 0;&lt;br /&gt;
	&lt;br /&gt;
	if( !CFrameWnd::PreCreateWindow(cs) )&lt;br /&gt;
	return FALSE;&lt;br /&gt;
	...&lt;br /&gt;
	...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Как работающая программа может определить, что юзер завершает работу Windows?===&lt;br /&gt;
В этот момент всем процессам посылается сообщение WM_QUERYENDSESSION - его и нужно отловить в обработчике OnQueryEndSession(). Если вернуть из обработчика значение 0, то Windows продолжит работу.&lt;br /&gt;
&lt;br /&gt;
===Как сделать всплывающую подсказки для класса CWnd и классов, от него производных?===&lt;br /&gt;
Допустим, имеется диалог класса CMyDlg. Делаем подсказки для контролов. (для CStatic контролов не забудьте поставить свойство Notify)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class CMyDlg:puplic CDialog&lt;br /&gt;
{&lt;br /&gt;
	CToolTipCtrl m_ToolTip;//мембер класса CMyDlg&lt;br /&gt;
	//&lt;br /&gt;
};&lt;br /&gt;
	&lt;br /&gt;
//массив, в котором перечислены идентификаторы&lt;br /&gt;
//контролов и тексты подсказок к ним&lt;br /&gt;
struct{int ID;const char* pch;} m_a_Tips[]=&lt;br /&gt;
{&lt;br /&gt;
	{IDC_BUTTON1,&amp;quot;КЫнопка&amp;quot;},&lt;br /&gt;
	{IDC_STATIC1,&amp;quot;Текст&amp;quot;},&lt;br /&gt;
	//&lt;br /&gt;
	{0,0},//признак конца массива&lt;br /&gt;
};&lt;br /&gt;
	&lt;br /&gt;
//в инициализации диалога (хотя, в принципе,&lt;br /&gt;
//можно и не тут) создаём и привязываем подсказки&lt;br /&gt;
BOOL CMyDlg::OnInitDialog() &lt;br /&gt;
{&lt;br /&gt;
	CDialog::OnInitDialog();&lt;br /&gt;
	//&lt;br /&gt;
	//создаём&lt;br /&gt;
	m_ToolTip.Create(this);&lt;br /&gt;
	//Привязка подсказок&lt;br /&gt;
	for(int i=0; m_a_Tips[i].ID; i++)&lt;br /&gt;
	{&lt;br /&gt;
		m_ToolTip.AddTool(&lt;br /&gt;
			GetDlgItem(m_a_Tips[i].ID),&lt;br /&gt;
			m_a_Tips[i].pch);&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	//включаем показ подсказок&lt;br /&gt;
	m_ToolTip.Activate(1);&lt;br /&gt;
	...&lt;br /&gt;
	...&lt;br /&gt;
}&lt;br /&gt;
	&lt;br /&gt;
//для того, чтобы подсказки отображались как реакция на движение&lt;br /&gt;
//курсора мыши, транслируем получаемые окнами сообщения в&lt;br /&gt;
//виртуальной PreTranslateMessage()&lt;br /&gt;
BOOL CMyDlg::PreTranslateMessage(MSG* pMsg) &lt;br /&gt;
{&lt;br /&gt;
	//транслируем&lt;br /&gt;
	if(m_ToolTip.m_hWnd)m_ToolTip.RelayEvent(pMsg);&lt;br /&gt;
	&lt;br /&gt;
	...&lt;br /&gt;
	...&lt;br /&gt;
	return CDialog::PreTranslateMessage(pMsg);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Как в отладчике VС просмотреть содержимое std::vector&amp;lt;string&amp;gt; V===&lt;br /&gt;
В режиме отладки открываем окно &amp;quot;Watch&amp;quot; (ALT+3) и вставляем выражения:&lt;br /&gt;
   &lt;br /&gt;
V._Myfirst      - будет показан первый элемент&lt;br /&gt;
V._Myfirst+1   - второй&lt;br /&gt;
V._Myfirst+2   - и т.д.&lt;br /&gt;
===Я вывожу на контекст устройства текст. Как определить в пикселах ширину и высоту выведенных символов текста?===&lt;br /&gt;
использовать процедуру API&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
BOOL GetTextExtentPoint32(&lt;br /&gt;
	HDC hdc,// хендл контекста&lt;br /&gt;
	LPCTSTR lpString,// выводимая строка&lt;br /&gt;
	int cbString,// длина строки в символах&lt;br /&gt;
	LPSIZE lpSize// указатель на структуру SIZE, куда &lt;br /&gt;
					//будут помещены размеры&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:FAQ]]&lt;/div&gt;</summary>
		<author><name>Mczim</name></author>	</entry>

	</feed>