当前位置:首页 > 操作系统 > Windows

自制WINDOWS窗口框架(修改完善后实现了输入和显示功能),C+WIN-API,再也不用面对黑框框学C语言了

            <br />/*使用DEVC++5.0编译通过,新手朋友请注意,启动顺序为打开DEVC++  -  新建项目  - 新建windows application程序(这里不是控制台程序),<br />然后新建HELLOWORD项目,清空MAIN.C代码,将本代码复制进去编译运行即可,<br />具体功能通过修改C代码实现,大家自己去探索。代码保存为.C文件,直接打开无法通过*/<br />截图:
技术分享图片
            <br />代码如下:<br /><br /><br />#include <windows.h>
<span>//</span><span>#include <stdlib.h></span><span>#define</span> IDC_EDIT1    201               <span>//</span><span>自定义控件识别号</span><span>#define</span> IDC_EDIT2    202
<span>#define</span> IDC_STATIC   301
<span>#define</span> IDC_BTN1     101

<span>//</span><span>回调函数.............................................................................</span><span>
LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    
    </span><span>static</span> TCHAR sss[<span>256</span>];                  <span>//</span><span>不同的case分支之间传值一定要定义全局变量,否则会出错 </span><span>static</span> TCHAR sss1[<span>256</span><span>]; 
    </span><span>static</span><span>int</span> len,size,i,j,x=<span>10</span>,y=<span>200</span><span>;
    </span><span>static</span><span>double</span><span> sun;
    TCHAR  szText[</span><span>256</span><span>]; 
    HWND edit1,edit2;    
    HWND an1;
    HWND sta1;                                                    
    </span><span>switch</span>(uMsg)                          <span>//</span><span>消息分支选择,注意SWITCH-CASE结构中,BREAK代表跳出当前SWITCH,RETURN代表结束整个函数。 </span><span>    {                                                               
    </span><span>case</span><span> WM_COMMAND:
     {  
        </span><span>switch</span>(LOWORD(wParam))                                         <span>//</span><span>点击不同的控件显示,走不同的处理路径 </span><span>        {  
        </span><span>case</span> IDC_BTN1:                                              <span>//</span><span>点击按钮1触发消息         </span><span>            {
            </span><span>//</span><span>MessageBox(hwnd,"提交成功","提示",MB_OK|MB_ICONINFORMATION);</span>
            len=GetDlgItemText(hwnd,IDC_EDIT1,sss,<span>255</span>);              <span>//</span><span>获取控件内容函数 ,返回值为控件文本字节长度 
            </span><span>//</span><span>MessageBox(hwnd,sss,"输入内容",MB_OK);</span>
            GetDlgItemText(hwnd,IDC_EDIT2,sss1,<span>255</span><span>); 
            
            
            sun</span>=atof(sss)+<span>atof(sss1);                                       
</span><span>/*</span><span>处理数据输入和涉及到数字运算用这个函数转换数据类型:【atof()】是把字符串转换成整型数的一个函数,扫描参数nptr字符串,跳过前面的空格字符,直到遇上数字或正负符号才开始做转换,而再遇到非数字或字符串结束时(‘‘)才结束转换,并将结果返回.默认返回类型为double类型,包含在头文件stdlib.h中。反方向函数为itoa()将整数转换成字符串</span><span>*/</span><span>
            
            InvalidateRect(hwnd,NULL,TRUE);                             </span><span>//</span><span>发送刷新指令 ,这个很关键。要不然窗口不会及时显示结果。。 </span><span>            }
            </span><span>break</span><span>;
        </span><span>default</span><span>:  
            </span><span>break</span><span>;      
        } 
        </span><span>break</span><span>;     
    } 
    </span><span>break</span><span>;
    </span><span>case</span> WM_DESTROY:                                                     <span>//</span><span>当前窗口被销毁时</span>
        PostQuitMessage(<span>0</span>);                                              <span>//</span><span>发出退出程序的消息</span><span>break</span><span>;                                                        
 
    </span><span>case</span> WM_CLOSE:                                                       <span>//</span><span>右上角关闭按钮消息 </span>
        DestroyWindow(hwnd);                                             <span>//</span><span>销毁窗口</span><span>break</span><span>;
    </span><span>case</span> WM_CREATE:                                                      <span>//</span><span>控件创建消息 </span><span>        {
        edit1 </span>= CreateWindow(<span>"</span><span>EDIT</span><span>"</span>,NULL, WS_CHILD|WS_VISIBLE|WS_BORDER,  <span>220</span>, <span>30</span>, <span>100</span>,<span>25</span>,hwnd,(HMENU)IDC_EDIT1, NULL, NULL);  <span>//</span><span>创建编辑框控件</span><span>
        edit2 </span>= CreateWindow(<span>"</span><span>EDIT</span><span>"</span>,NULL, WS_CHILD|WS_VISIBLE|WS_BORDER,  <span>220</span>, <span>60</span>, <span>100</span>,<span>25</span>,hwnd,(HMENU)IDC_EDIT2, NULL, NULL);  <span>//</span><span>创建编辑框控件</span><span>
        an1 </span>= CreateWindow(<span>"</span><span>button</span><span>"</span>,<span>"</span><span>计算</span><span>"</span>,WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,<span>340</span>,<span>60</span>,<span>50</span>,<span>25</span>,hwnd,(HMENU)IDC_BTN1,NULL,NULL);     <span>//</span><span>创建按钮控件 
    
        </span><span>//</span><span>sta1= CreateWindow("STATIC","+",WS_CHILD|WS_VISIBLE|SS_CENTER,70,10,300,200,hwnd,(HMENU)IDC_STATIC,NULL,NULL); </span><span>//</span><span>创建静态文本框控件,画布,美化作用,下一步再深入研究        </span><span>        }
        </span><span>break</span><span>;
    </span><span>case</span> WM_PAINT:                                                      <span>//</span><span>【重绘窗口函消息 】 </span><span>        {   
        HDC hdc;                                                        </span><span>//</span><span>定义输出设备句柄 
        </span><span>//</span><span>RECT rect;                                                    </span><span>//</span><span>定义一块显示区域,DrawText 函数需要的参数 </span>
        PAINTSTRUCT ps = {<span>0</span>};                                           <span>//</span><span>定义一个 数组存放字符串 </span>
        hdc = BeginPaint(hwnd,&ps);                                     <span>//</span><span>开始重绘</span><span>/*</span><span>*****************************************核心程序代码区*****************************************************************</span><span>*/</span><span>        
        SetTextColor(hdc, RGB(</span><span>255</span>,<span>0</span>,<span>0</span>));                                <span>//</span><span>设置字体颜色</span>
        Rectangle(hdc,<span>2</span>,<span>2</span>,<span>818</span>,<span>555</span><span>);
        Rectangle(hdc,</span><span>10</span>,<span>190</span>,<span>810</span>,<span>550</span>);                                  <span>//</span><span>画矩形,必须在正文之前显示框,否则正文会被覆盖 </span><span>        
        
        TextOut(hdc,</span><span>350</span>,<span>200</span>,TEXT(<span>"</span><span>九九乘法表</span><span>"</span>),<span>10</span>);                     <span>//</span><span>直接文本显示                                              </span><span>for</span>(i=<span>1</span>;i<=<span>9</span>;i++<span>)
            </span><span>for</span>(j=<span>1</span>;j<=i;j++<span>) {                              
            size </span>= wsprintf(szText,TEXT(<span>"</span><span>%d×%d=%2d</span><span>"</span>),j,i,i*j);          <span>//</span><span>将变量S,I的值按照格式符号%s%d转换后存入缓冲区szText,返回值为字节长度 </span><span>/*</span><span>注意:因为 wsprintf不支持浮点数,所以处理高精度数据计算式要用 swprintf代替</span><span>*/</span><span> 
            TextOut(hdc,x</span>+j*<span>80</span>,y+i*<span>25</span><span>, szText,size);
            }
        
        TextOut(hdc,</span><span>650</span>,<span>530</span>,TEXT(<span>"</span><span>小狗WINDOWS小程序</span><span>"</span>),<span>17</span><span>);    
        Rectangle(hdc,</span><span>10</span>,<span>10</span>,<span>810</span>,<span>180</span>);                                     <span>//</span><span>矩形(美化类函数,形成边框效果) </span>
        TextOut(hdc,<span>450</span>,<span>30</span>,TEXT(<span>"</span><span>简单的WIN32窗口框架,能够实现输入和显示</span><span>"</span>),<span>39</span><span>);
        TextOut(hdc,</span><span>100</span>,<span>30</span>,TEXT(<span>"</span><span>请输入参数A的值:</span><span>"</span>),<span>16</span><span>);
        TextOut(hdc,</span><span>100</span>,<span>60</span>,TEXT(<span>"</span><span>请输入参数B的值:</span><span>"</span>),<span>16</span><span>);
        TextOut(hdc,</span><span>100</span>,<span>90</span>,TEXT(<span>"</span><span>A+B=           :</span><span>"</span><span>),len);         
        </span><span>/*</span><span>显示数字用以下代码</span><span>*/</span><span> 
        size </span>= sprintf(szText,TEXT(<span>"</span><span>%.4lf</span><span>"</span><span>),sun);
        TextOut(hdc,</span><span>220</span>,<span>90</span><span>,szText,size);          
        </span><span>/*</span><span>显示文字或字母用以下代码 
        TextOut(hdc,550,30,sss,len);</span><span>*/</span><span>/*</span><span>*****************************************核心程序代码区*****************************************************************</span><span>*/</span><span>           
            EndPaint(hwnd,</span>&ps);                                         <span>//</span><span>结束重绘        </span><span>        }
           </span><span>break</span><span>;
    </span><span>default</span><span>:
            </span><span>return</span><span> DefWindowProc(hwnd, uMsg, wParam, lParam);   
 }
 </span><span>return</span><span>0</span><span>;
}

</span><span>/*</span><span>********************************************以下为主窗口函数*********************************************************************</span><span>*/</span><span>int</span> WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,<span>int</span><span> nCmdShow){
WNDCLASSEX wzgwind </span>= {<span>0</span>};                                                 <span>//</span><span>窗口类结构, 为注册窗口类作准备</span>
    wzgwind.cbSize = <span>sizeof</span>(wzgwind);                                     <span>//</span><span>WNDCLASSEX结构的大小</span>
    wzgwind.cbWndExtra = <span>0</span>;                                               <span>//</span><span>窗口额外内存, 没有, 设为0</span>
    wzgwind.hbrBackground = COLOR_WINDOW;                                 <span>//</span><span>使用系统默认背景 
    </span><span>//</span><span>wzgwind.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH);         </span><span>//</span><span>窗口背景, 这里使用灰色背景(另一种表示法) </span>
    wzgwind.hCursor = LoadCursor(NULL, MAKEINTRESOURCE(IDC_ARROW));       <span>//</span><span>应用程序使用的鼠标类型</span>
    wzgwind.hIcon = LoadIcon(NULL, MAKEINTRESOURCE(IDI_APPLICATION));     <span>//</span><span>光标类型</span>
    wzgwind.hIconSm = NULL;                                               <span>//</span><span>应用程序程序的小光标, 不管, 设为 NULL</span>
    wzgwind.hInstance = hInstance;                                        <span>//</span><span>应用程序程序实例句柄, 由 WinMain 函数传递过来</span>
    wzgwind.lpfnWndProc = WndProc;                                        <span>//</span><span>这个很重要, 就是当前窗口的消息处理函数, 传递 WndProc 的地址</span>
    wzgwind.lpszClassName = <span>"</span><span>wzgwind</span><span>"</span>;                                    <span>//</span><span>创建类时使用的类名, 可以自定义</span>
    wzgwind.lpszMenuName = NULL;                                          <span>//</span><span>菜单, 没有, 就使用 NULL</span>
    wzgwind.style = CS_HREDRAW | CS_VREDRAW;                              <span>//</span><span>类的风格, 垂直重绘, 水平重绘</span><span>
ATOM nAtom </span>= RegisterClassEx(&<span>wzgwind);
    </span><span>if</span> (!<span>nAtom )
    {
        MessageBox(NULL, </span><span>"</span><span>注册失败</span><span>"</span>, <span>"</span><span>Infor</span><span>"</span><span>, MB_OK);
        </span><span>return</span><span>0</span><span>;
    }

HWND hwnd </span>= CreateWindowEx(WS_EX_CLIENTEDGE,<span>"</span><span>wzgwind</span><span>"</span>,<span>"</span><span>win-gou</span><span>"</span>,WS_VISIBLE|<span>WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT,                                                     </span><span>/*</span><span> x </span><span>*/</span><span>
        CW_USEDEFAULT,                                                     </span><span>/*</span><span> y </span><span>*/</span><span>840</span>,                                                               <span>/*</span><span> width </span><span>*/</span><span>600</span>,                                                               <span>/*</span><span> height </span><span>*/</span><span>
        NULL,NULL,hInstance,NULL);



ShowWindow(hwnd,nCmdShow);

UpdateWindow(hwnd);

MSG msg </span>= { <span>0</span> };                                                          <span>//</span><span>定义并初始化msg</span><span>while</span>( msg.message != WM_QUIT )                                          <span>//</span><span>使用while循环,如果消息不是WM_QUIT消息,就继续循环</span><span>    {
        </span><span>if</span>( PeekMessage( &msg, <span>0</span>, <span>0</span>, <span>0</span>, PM_REMOVE ) )                      <span>//</span><span>查看应用程序消息队列,有消息时将队列中的消息派发出去。</span><span>        {
            TranslateMessage( </span>&msg );                                      <span>//</span><span>将虚拟键消息转换为字符消息</span>
            DispatchMessage( &msg );                                      <span>//</span><span>分发一个消息给窗口程序。</span><span>        }
    }

UnregisterClass(</span><span>"</span><span>wzgwind</span><span>"</span><span>, wzgwind.hInstance);
</span><span>return</span><span>0</span><span>;
} </span>

 

原文:https://www.cnblogs.com/gougouwang/p/11546397.html


【说明】本文章由站长整理发布,文章内容不代表本站观点,如文中有侵权行为,请与本站客服联系(QQ:254677821)!

相关教程推荐

其他课程推荐