基础
<p>[TOC]</p>
<p>最简单的hello world程序</p>
<pre><code class="language-cpp">#include<windows.h>
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) {
MessageBox(NULL, TEXT("hello world"), TEXT("HelloMsg"), 0);
return 0;
}</code></pre>
<h1>🌓表头文件</h1>
<p>每个C语言编写的Windows程序都以</p>
<pre><code class="language-cpp">#include<windows.h>
</code></pre>
<p>开头</p>
<p>WINDOWS.H是主要的头文件,它包含了其他Windows表头文件,然后那些表头文件包含了其他的表头文件</p>
<ul>
<li>WINDEF.H 基本类型定义</li>
<li>WINNT.H 支持Unicode的类型定义</li>
<li>WINBASE.H kernel函数</li>
<li>WINUSER.H 使用者接口函数</li>
<li>WINGDI.H 图形设备接口函数</li>
</ul>
<h1>🌓程序入口点</h1>
<p>Windows的进入点为WinMain</p>
<pre><code class="language-cpp">int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
</code></pre>
<p>在WINBASE.H中的声明为</p>
<pre><code>int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int iCmdShow)
</code></pre>
<p>第三个参数我们改为了PSTR,而WINBASE.H中定义为LPSTR,这两种数据类型都定义在WINNT.H中,LP前缀代表 『长指针』</p>
<p>WinMain函数声明返回一个int值,WINAPI标识符在WINDEF.H定义为</p>
<pre><code>#define WINAPI __stdcall</code></pre>
<p>该语句制定了调用约定,即参数如何传递</p>
<p>WinMain第一个参数称为 『执行实体句柄』,在Windows程序设计中,句柄是一个应用程序用来识别某些东西的数字,该句柄唯一地标识该程序</p>
<p>程序通过检查hPrevInstance参数就能够确定自身的其他执行实体是否在运行,然后就可以略过一些复杂的工作从前面的执行实体将某些数据复制到自己的数据区域,现在这个概念已经被抛弃了,一般设置为0</p>
<p>第三个参数是用于执行程序的命令行,第四个参数则是指出程序最初显示的方式,可以是正常的或者最大化最小化</p>
<h1>🌓大写字母标识符</h1>
<p>在后续学习中会发现有很多大写的标识符号,通常形式为两三个字母前缀+下划线,例如 <code>CS_HREADRAW</code> 、 <code>CS_VREDRAW</code> 、 <code>CW_USEDEFAULT</code> 之类的,这些其实就是简单的数值常数,不同的前缀代表该数值所属类别</p>
<table>
<thead>
<tr>
<th></th>
<th></th>
</tr>
</thead>
<tbody>
<tr>
<td>前缀</td>
<td>类别</td>
</tr>
<tr>
<td>CS</td>
<td>窗口类别样式</td>
</tr>
<tr>
<td>CW</td>
<td>建立窗口</td>
</tr>
<tr>
<td>DT</td>
<td>绘制文字</td>
</tr>
<tr>
<td>IDI</td>
<td>图示ID</td>
</tr>
<tr>
<td>IDC</td>
<td>游标ID</td>
</tr>
<tr>
<td>MB</td>
<td>消息框</td>
</tr>
<tr>
<td>SND</td>
<td>声音</td>
</tr>
<tr>
<td>WM</td>
<td>窗口消息</td>
</tr>
<tr>
<td>WS</td>
<td>窗口样式</td>
</tr>
</tbody>
</table>
<h1>🌓匈牙利表示法</h1>
<p>Windows中很多变量看起来都很古怪,例如szCmdLine,这种标识方式叫做匈牙利表示法,用来纪念一个匈牙利程序员,这种标识方法很简单,变量以一个或多个小写字母开头,这些字母表示变量的数据类型,例如sz代表以0结尾的字符串,hInstance中的h代表句柄,iCmdShow中的i代表整数</p>
<p>在命名结构变量时,可以用结构名的小写作为变量名的前缀或者用作整个变量名,比如msg变量是MSG类型的结构</p>
<p>匈牙利表示法能够帮助程序员及时发现并避免程序中的错误,由于变量名既描述了变量名的作用又描述了数据类型,就可以避免产生数据类型不合的错误</p>
<p>常用的变量前缀为</p>
<table>
<thead>
<tr>
<th></th>
<th></th>
</tr>
</thead>
<tbody>
<tr>
<td>前缀</td>
<td>数据类型</td>
</tr>
<tr>
<td>c</td>
<td>char或WCHAR或TCHAR</td>
</tr>
<tr>
<td>by</td>
<td>BYTE</td>
</tr>
<tr>
<td>n</td>
<td>short</td>
</tr>
<tr>
<td>i</td>
<td>int</td>
</tr>
<tr>
<td>x,y</td>
<td>int,分别用作x坐标和y坐标</td>
</tr>
<tr>
<td>cx,cy</td>
<td>int,分别用作x长度和y长度</td>
</tr>
<tr>
<td>b或f</td>
<td>BOOL,f代表flag</td>
</tr>
<tr>
<td>w</td>
<td>WORD</td>
</tr>
<tr>
<td>l</td>
<td>LONG</td>
</tr>
<tr>
<td>dw</td>
<td>DWORD</td>
</tr>
<tr>
<td>fn</td>
<td>function</td>
</tr>
<tr>
<td>s</td>
<td>string</td>
</tr>
<tr>
<td>sz</td>
<td>以字节值0结尾的字符串</td>
</tr>
<tr>
<td>h</td>
<td>句柄</td>
</tr>
<tr>
<td>p</td>
<td>指针</td>
</tr>
</tbody>
</table>