如何为一个win32的程序添加控制台窗口
Win32控制台程序界面类
Win32控制台程序界面类我相信不少同学也和我一样,在刚学习c++的时候都会尝试做简单的图书管理系统,学生成绩管理系统等,做这些实验项目可以加深你对文件操作,vector,list等容器的熟悉度,还可以让你学会设计系统结构。
随着学习的逐渐深入,同学们也许会发现,很多时候我们只要调用标准库函数里的类,代码量就会少很多,如果我们在平时的练习里有意识地去封装一些也许会比较常用的类,那么是不是我们平时编程的效率也会快好多呢。
答案是肯定的,特别对于XXXX系统之类的程序来说,可供应的地方就更多了,要重复使用这些我们自己封装好的类,只要将我们做好的类的.h和.cpp文件与我们做好想做的程序的代码放在同一个文件夹里就好。
下面我就将我在做好的界面类与大家分享,由于时间仓促,所做的类的调用方法也比较少,接下来的时间里,我会继续扩充该类的方法,以便适应未来工作学习的需要,同时也方便大家头文件:windesign.h//划线类(专供windowDesigner.h使用)wndowDesigner.h//画界面类其他要包含的cpp文件questionwin.cppwindesign.cppwindowDesigner.cppwindesign.h的方法:winDesign& leftSide(int,char);//首行缩进winDesign& leftSidec(int,char,char);//首行缩进做加左边框winDesign& Sidesc(int,char);//边框左winDesign& SidescR(int,int,char);//边框右winDesign& SidescL(int,int,char);//边框左2winDesign& centre(int,int,char,string);//中部内容winDesign& centre(int ,char );//中部标题,上下部边框(绘制一行的内容需要用到其中的几个方法)windowDesigner.h的方法:void mainwin(string sentence[],int n,int s);//画主界面//各行内容,选项数,缩进(选项数要大于sentence[]的元素数)void questionwin(string sentence[],int n,int s);//对话框//各行内容,选项数,缩进void needinput(string sentence[],string input[],int n,int s);//需要输入的界面//各文件源代码:windesign.h文件#ifndef WINDESIGN_H#define WINDESIGN_H#include<string>using std::string;#include<iomanip>using std::setfill;using std::setw;class winDesign{public:winDesign& leftSide(int,char);//首行缩进winDesign& leftSidec(int,char,char);//首行缩进做加左边框winDesign& Sidesc(int,char);//边框左winDesign& SidescR(int,int,char);//边框右winDesign& SidescL(int,int,char);//边框左2winDesign& centre(int,int,char,string);//中部内容winDesign& centre(int ,char );//中部标题,上下部边框};#endifwndowDesigner.h文件#ifndef WINDOWDESIGNER_H#define WINDOWDESIGNER_H#include"windesign.h"#include<string>using std::string;class windowDesigner{public:windowDesigner(winDesign){};//实验品(组成)void mainwin(string sentence[],int n,int s);//画主界面//各行内容,选项数,缩进void questionwin(string sentence[],int n,int s);//对话框//各行内容,选项数,缩进void needinput(string sentence[],string input[],int n,int s);//需要输入的界面// private:winDesign Line;};#endifquestionwin.cpp#include<iostream>using std::cout;using std::cin;using std::endl;#include<iomanip>using std::setfill;using std::setw;#include"windowDesigner.h"void windowDesigner::questionwin(string sentence[],int n,int s){int a=1;//边框粗细int h1=25;//整体缩进(数值越大越靠右)int k1=30;//窗口宽度(数值越大越靠下)int i;int n1=10;for(i=0;i<n1;i++){cout<<endl;}Line.leftSide(h1,' ').SidescR(a,a,'=').centre(k1,'=').SidescL(a,a,'=');//上边cout<<endl;Line.leftSide(h1,' ').SidescR(a,a,'=').centre(7,k1,' ',sentence[0]).SidescL(a,a,'=');cout<<endl;//标题Line.leftSide(h1,' ').SidescR(a,a,'=').centre(k1,' ').SidescL(a,a,'=');cout<<endl;for(i=1;i<n;i++)//选项{Line.leftSide(h1,' ').SidescR(a,a,'=').centre(s,k1,' ',sentence[i]).SidescL(a,a,'=');cout<<endl;Line.leftSide(h1,' ').SidescR(a,a,'=').centre(k1,' ').SidescL(a,a,'=');cout<<endl;}if(i<n-1){cout<<endl;}//(如果没有这句话,最后一个选项会有写不协调) Line.leftSide(h1,' ').SidescR(a,a,'=').centre(k1,'=').SidescL(a,a,'=');//底边cout<<endl;}windesign.cpp#include<iostream>using std::cout;using std::endl;#include"windesign.h"winDesign &winDesign::leftSide(int n1,char s3){cout<<setfill(s3)<<setw(n1)<<s3;return *this;}winDesign& winDesign::leftSidec(int n1,char s3,char s4){cout<<setfill(s3)<<setw(n1)<<s4;return*this;}//首行缩进做加左边框winDesign &winDesign::Sidesc(int n2,char a1){cout<<setfill(a1)<<setw(n2)<<a1;return *this;}winDesign &winDesign::centre(int n4,int n3,char s2,string str1) {int i;i=str1.length();cout<<setfill(s2)<<setw(n4)<<s2;cout<<str1;cout<<setfill(s2)<<setw(n3-n4-i)<<s2;return *this;}winDesign &winDesign::centre(int n3,char s2){cout<<setfill(s2)<<setw(n3)<<s2;return *this;}winDesign &winDesign::SidescR(int n2,int n21,char s1){cout<<setfill(' ')<<setw(n2-n21)<<' ';cout<<setfill(s1)<<setw(n21)<<s1;return *this;}winDesign &winDesign::SidescL(int n2,int n21,char s1) {cout<<setfill(s1)<<setw(n21)<<s1;cout<<setfill(' ')<<setw(n2-n21)<<' ';return *this;}windowDesigner.cpp文件#include<iostream>using std::cout;using std::cin;using std::endl;#include<iomanip>using std::setfill;using std::setw;#include"windowDesigner.h"void windowDesigner::mainwin(string sentence[],int n,int s){int h1=12;/*缩进*/const int n1=2;//头两行列数int h2=7,h3=45,h4=4;//头两行int y[4]={8,7,39,9};//第三行标题int k[3]={7,36,13};//const int n2=5,n3=8;int m2=8,m3=40,m4=8;//选项行间隔int mouth2=8,mouth3=10,mouth4=36,mouth5=12;//(窗口装饰)嘴int empty2=4,empty3=45,empty4=7;//空行int legL=4;//腿长=legL-1;int leg2=25,leg3=6,leg4=25;//腿行int a=1;//边框粗细int i;for(i=0;i<n1;i++)//绘制头顶部边框,行数n1=2{Line.leftSide(h1,' ').Sidesc(h2,'=').centre(h3,'=').Sidesc(h4,'=');cout<<endl;}Line.leftSide(h1,' ').Sidesc(y[0],'=').centre(y[1],y[2],'=',sentence[0]).Sidesc(y[3],'=');cout<<endl;//标题Line.leftSide(h1,' ').SidescL(8,n2-i+4,'=').centre(40,' ').SidescR(8,n2-i+4,'=');cout<<endl;//空白行for(i=1;i<n;i++)//选项{Line.leftSide(h1,' ').SidescL(k[0],a,'=').centre(s,k[1],' ',sentence[i]).SidescR(k[2],a,'=');cout<<endl;Line.leftSide(h1,' ').SidescL(5,a,'=').centre(45,' ').SidescR(6,a,'=');cout<<endl;}if(i<n-1){cout<<endl;}//(如果没有这句话,最后一个选项会有写不协调)for(i=0;i<n1;i++){Line.leftSide(h1,' ').SidescL(empty2,a,'=').centre(empty3,' ').SidescR(empty4,a,'=');cout<<endl;}Line.leftSide(h1,' ').SidescL(mouth2,a,'=').centre(mouth3,mouth4,'',"*********************").SidescR(mouth5,a,'=');cout<<endl;Line.leftSide(h1,' ').SidescL(mouth2,a,'=').centre(mouth3,mouth4,' ',"**").SidescR(mouth5,a,'=');cout<<endl;Line.leftSide(h1,' ').SidescL(mouth2,a,'=').centre(mouth3,mouth4,' ',"**").SidescR(mouth5,a,'=');cout<<endl;for(i=0;i<n1;i++){Line.leftSide(h1,' ').Sidesc(h2,'=').centre(h3,'=').Sidesc(h4,'=');cout<<endl;}for(i=1;i<legL;i++){Line.leftSide(h1,' ').SidescL(leg2,leg2-2*i,'=').centre(leg3,' ').SidescR(leg4,leg4-2*i,'=');cout<<endl;}cout<<endl;}。
win32编写控件例程
win32编写控件例程Win32编写控件例程可以用于创建自定义的窗口控件,以满足特定的应用需求。
下面是一个简单的Win32控件例程的步骤和代码示例:步骤1,包含头文件和定义全局变量。
c.#include <Windows.h>。
// 全局变量。
HINSTANCE hInst;HWND hWndMain;HWND hCustomControl;步骤2,声明窗口过程函数。
c.LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);步骤3,编写WinMain函数。
c.int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)。
{。
// 初始化全局变量。
hInst = hInstance;// 注册窗口类。
WNDCLASSEX wcex;wcex.cbSize = sizeof(WNDCLASSEX);wcex.style = CS_HREDRAW | CS_VREDRAW;wcex.lpfnWndProc = WndProc;wcex.cbClsExtra = 0;wcex.cbWndExtra = 0;wcex.hInstance = hInstance;wcex.hIcon = LoadIcon(hInstance, IDI_APPLICATION); wcex.hCursor = LoadCursor(NULL, IDC_ARROW);wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); wcex.lpszMenuName = NULL;wcex.lpszClassName = L"CustomControlExample";wcex.hIconSm = LoadIcon(wcex.hInstance,IDI_APPLICATION);if (!RegisterClassEx(&wcex))。
windows下控制台程序实现窗口显示
windows下控制台程序实现窗⼝显⽰windows下实现窗⼝显⽰,如果限定是C/C++语⾔,并且是原⽣Windows⽀持,需要使⽤GDI或GDI+。
⼀般是在Visual Studio⾥新建Win32应⽤程序,⽽不是Win32 console application(控制台程序),然后使⽤GDI的⼀些API,例如CreateWindow、CreateWindowEx来实现窗⼝的创建、显⽰等。
实际上MSDN官⽅并没有说只能是Win32应⽤程序,控制台程序完全可以。
个⼈并不习惯WinMain()函数,更习惯main(int argc, char** argv)。
例如OpenCV的highgui模块,它⾥⾯的cvNamedWindow(), cvShowImage(), cvWaitKey()这⼏个函数,在windows下的实现,如果不考虑其opengl版本的话,它是基于GDI实现的;⽽作为⼀个⼴泛使⽤的图像处理库,OpenCV源码中并没有WinMain函数。
第1种实现下⾯是⽤纯C实现的“调⽤GDI的API接⼝,实现控制台类型程序中显⽰窗⼝”的样例程序,改编⾃#include <stdio.h>#include <windows.h>LRESULT __stdcall WindowProcedure(HWND window, unsigned int msg, WPARAM wp, LPARAM lp){switch(msg){case WM_DESTROY:printf("\ndestroying window\n");PostQuitMessage(0) ;return 0L ;case WM_LBUTTONDOWN:printf("\nmouse left button down at (%d, %d)\n", LOWORD(lp), HIWORD(lp));// fall thrudefault:printf(".");return DefWindowProc( window, msg, wp, lp ) ;}}typedef struct MyRect{int x, y, width, height;} MyRect;int main(){printf("hello world!\n");const char* const myclass = "myclass" ;WNDCLASSEX wc;wc.cbSize = sizeof(WNDCLASSEX);/* Win 3.x */wc.style = CS_DBLCLKS;wc.lpfnWndProc = WindowProcedure;wc.cbClsExtra = 0;wc.cbWndExtra = 0;wc.hInstance = GetModuleHandle(0);wc.hIcon = LoadIcon(0, IDI_APPLICATION);wc.hCursor = LoadCursor(0, IDC_ARROW);wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);wc.lpszMenuName = 0;wc.lpszClassName = myclass;/* Win 4.0 */wc.hIconSm = LoadIcon(0, IDI_APPLICATION);if(RegisterClassEx(&wc)){MyRect rect;rect.x = 300;rect.y = 300;rect.width = 640;rect.height = 480;HWND window = CreateWindowEx( 0, myclass, "title",WS_OVERLAPPEDWINDOW, rect.x, rect.y,rect.width, rect.height, 0, 0, GetModuleHandle(0), 0 ) ;if(window){ShowWindow( window, SW_SHOWDEFAULT ) ;MSG msg ;while( GetMessage( &msg, 0, 0, 0 ) ) DispatchMessage(&msg);}}}第2种实现实际上,在Visual Studio中通过“菜单栏”->"⽂件"->“新建项⽬”->"Win32项⽬"(或"Win32控制台项⽬"进⼊后再选“Windows应⽤程序”),创建的“Hello World”⼯程提供的代码也仅仅是“显⽰⼀个窗⼝”,只不过⼊⼝函数是WinMain,其内容如下:// gdi_show_png.cpp : 定义应⽤程序的⼊⼝点。
创建第一个C++Win32控制台应用程序
创建第一个C++的Win32控制台应用程序
1.打开VS2008,依次选择菜单:文件--→新建--→项目。
2.在新建项目窗口中,依次选择项目类型中的其他语言--→Visual C++ ----→Win32,选择模板中的Win32控制台应用程序。
在名称栏中输入项目名称 Win32ConsoleApplicaiton,项目所在位置可单击浏览按钮选择目录位置。
选择完毕后,单击确定按钮。
3.在Win32应用程序向导中单击“下一步”
4.不用修改任何选项,单击“下一步”
5. 右侧是解决方案的资源管理器,双击文件名可以打开相应文件。
找到相应的main函数。
6.在main函数中输入相应的代码。
7.stdafx.h的作用,当我们使用AppWizard来自动生成某些项目的时候,系统会自动把所需要include的头文件在stdafx.h中先include一下,这样,我们只需要直接include这个stdafx.h文件即可.因为同一个项目中的不同源文件CPP都包含相同的include文件,这样,为每个.CPP文件都重复include这些文件就显得很傻了。
所以,在stdafx.h中填写头部文件。
在有main函数的文件中在添加代码:#include “stdafx.h”
即可。
8.按“Ctrl+F5”可以查看运行结果。
如果按F5或单击工具栏中的“”可以进行调试,
但无法保留最终运行结果。
Win32创建窗口过程
1.注册窗口类RegisterClassEx参数:Ipwcx:指向一个WNDCLASSEX结构的指针。
在传递给这个函数之前,必须在结构内填充适当的类的属性返回值:如果函数成功,返回这个窗口类型的标识号;如果函数失败,返回值为0。
若想获得更多错误信息,请调用GetLastError函数。
备注:如果使用RegisterClassEx来注册窗口类,应用程序通知系统被注册类的窗回的消息使用ANSI字符集的文本和字符参数;如果使用RegisterClassExW来注册窗口类,应用程序需要系统以Unicode来传递消息的文本参数。
IsWindowUnicode函数使应用程序可以查询每一个窗口的字符特征。
参看Win32 API中的ANSI和Unicode函数,请查阅Functiont prototype(函数原型)。
2.创建窗口CreateWindow参数: lpClassName//注册类的名称lpWindowName//注册窗口名称dwStyle //窗口风格x //窗口的水平位置y //窗口的垂直位置nWidth //窗口的宽度nHeight //窗口的高度hWndParent //父窗口或本窗口句柄hMenu //菜单句柄hInstance //应用程序实例句柄lpParam //窗口创建数据BOOL ShowWindow(HWND hWnd, // handle to window (窗口句柄) int nCmdShow// show state(显示状态));BOOL UpdateWindow(HWND hWnd// handle to window(窗口句柄) );3.消息处理MSG函数定义:Final 流程图:。
设置控制台窗口界面
怎样设置控制台窗口界面一、概述所谓控制台应用程序,就是指那些需要与传统DOS操作系统保持某种程序的兼容,同时又不需要为用户提供完善界面的程序。
简单地讲,就是指在Windows环境下运行的DOS程序。
一旦C++控制台应用程序在Windows 9x/NT/2000操作系统中运行后,就会弹出一个窗口。
例如下列过程:单击Visual C++标准工具栏上的“New Text File”按钮,打开一个新的文档窗口。
选择File | Save菜单或按快捷键Ctrl+S或单击标准工具栏的Save按钮,弹出“保存为”文件对话框。
将文件名为“Hello.cpp” (注意扩展名.cpp不能省略)。
在文档窗口中输入下列代码:#includevoid main(){cout<<"Hello, Console!"<}单击小型编译工具栏中的“Build”按钮或按F7键,系统出现一个对话框,询问是否将此项目的工作文件夹设定源文件所在的文件夹,单击[是]按钮,系统开始编译。
单击小型编译工具栏中的“Execute Program”按钮或按Ctrl+F5键,运行刚才的程序。
程序运行后,弹出下图的窗口。
这就是控制台窗口,与传统的DOS屏幕窗口相比最主要的区别有:(1) 默认的控制台窗口有系统菜单和标题,它是一个内存缓冲区窗口,缓冲区大小取决于Windows操作系统的分配;而DOS 屏幕是一种物理窗口,不具有Windows窗口特性,其大小取决于ROM BIOS分配的内存空间。
(2) 控制台窗口的文本操作是调用低层的Win32 APIs,而DOS屏幕的文本操作是通过调用BIOS的16(10h)中断而实现的。
(3) 默认的控制台窗口可以接收键盘和鼠标的输入信息,设备驱动由Windows管理,而DOS屏幕窗口接收鼠标时需要调用33h中断,且鼠标设备驱动程序由自己安装。
二、控制台文本窗口的一般控制步骤在Visual C++ 6.0中,控制台窗口界面的一般编程控制步骤如下:调用GetStdHandle获取当前的标准输入(STDIN)和标准输出(STDOUT)设备句柄。
win32gui用法
win32gui用法Win32 GUI编程是Windows平台下一种重要的开发方式,通过使用Win32 GUI库,我们可以创建具有图形用户界面(GUI)的应用程序。
其中,win32gui是Python中一个常用的GUI库,它提供了丰富的API,方便我们进行GUI开发。
一、win32gui库介绍win32gui库是Python中用于Windows平台下进行GUI开发的库,它提供了丰富的API,包括窗口、控件、消息、图标、位图等操作接口。
通过使用win32gui库,我们可以方便地进行窗口创建、消息处理、控件操作等GUI开发工作。
二、win32gui基本用法1. 导入win32gui库在使用win32gui库之前,需要先导入它。
在Python中,可以使用`import win32gui`语句来导入该库。
2. 创建窗口使用win32gui库创建窗口需要使用`win32gui.CreateWindow()`函数。
该函数需要传入窗口的类名、窗口的样式、窗口的父窗口等参数。
创建窗口后,可以通过调用其他函数来设置窗口的位置、大小、标题等信息。
示例代码:```pythonimport win32guiwindow_class = "MyWindowClass"window_style = win32con.WS_OVERLAPPEDWINDOW |win32con.WS_VISIBLEwindow_rect = (0, 0, 640, 480)window_proc = win32gui.WNDPROC()win32gui.RegisterClass(window_class)window = win32gui.CreateWindow(window_class, "My Window Title", window_style, window_rect, None, None, None, None, None)```3. 发送消息使用win32gui库可以发送各种消息到窗口中,例如WM_PAINT消息用于绘制窗口内容,WM_CLOSE消息用于关闭窗口等。
Win32 Tab Control的创建与使用
Tab Control控件的使用[基于Windows API]最后效果图如下:这个只是一个简单的创建Tab控件,后面会讲解怎么创建一个空间放置在这个Tab页面上. 操作步骤如下:1.导入头文件:#include <CommCtrl.h>,2.在消息处理函数中的WM_CREATE消息中将Tab控件创建处理:在WM_CREATE消息中:使用WC_TABCONTROL 参数传入CreateWindow函数中,创建Tab控件.如下:上图中的hwndTab 是一个局部的静态变量,你也可以声明为全局变量.这里的原因这里就不详细讲解了,后续有空的时候就讲解一下.hwndTab声明如下:3.当使用CreateWindow创建后必须验证,确保创建成功.4.给Tab控件传入Tab控件页的值,这里使用的是星期1~星期7作为Tab控件的标签名:4.1.传入TabCtrl_InsertItem一个TCITEM变量来创建.4.2.给TCITEM变量赋值注意,g_achTemp 是一个TCHAR类型的数组,用来存储标签名的变量,因为标签名使用for循环写入的.全局变量g_achTemp定义如下:4.3.使用for循环写入标签名:5.使用ShowWindow函数显示Tab控件此时我们可以编译运行.结果如上图所示.由于我们没有加入消息处理,若以此时的Tab控件没有任何内容,我们会在接下来的讲解部分讲解怎么处理消息.Tab控件的WM_NOTIFY消息传递与处理Tab控件发生标签页被切换的时候发生一个WM_NOTIFY,因此我们只要处理了WM_NOTIFY 消息就可以帮我们进行Tab控件的消息处理.结果图如下:步骤如下:1.给主程序添加一个WM_NOTIFY消息处理:2.添加一个静态局部变量hwndTab, hwndTab1, hwndTab2.分别表示Tab控件与Tab控件标签页面1,2中的按钮Tab1与Tab2按钮3.使用CreateWindow函数传入一个BUTTON类名来创建两个按钮Tab1,Tab2.注意此时我们应该使用ShowWindow函数将标签1页面中的控件显示而将标签2页面中的控件隐藏.4.讲解一下WM_NOTIFY消息中的wParam与lParam参数的含义,wParam:是一个标识发送WM_NOTIFY消息的控件IDlParam: 是一个指向NMHDR结构体的指针,其中NMHDR的定义如下:因此我们可以在WM_NOTIFY消息的处理程序中通过判断NMHDR结构体中的code 的值来确定Tab控件发送的消息的通知码来判断Tab控件的确切消息,TCN_SELCHANGE是当Tab控件的标签页发生改变的时候发送的消息.。
win32界面编程 实例
win32界面编程实例
Win32界面编程是指使用Win32 API来创建Windows应用程序
的用户界面。
下面我将从不同角度给出一些Win32界面编程的实例。
1. 创建窗口,使用Win32 API可以创建一个基本的窗口应用程序。
首先需要注册窗口类,然后创建窗口并处理窗口消息。
通过设
置窗口类的属性和消息处理函数,可以实现窗口的基本功能,比如
响应用户输入、绘制图形等。
2. 控件和布局,Win32 API提供了一系列控件,比如按钮、文
本框、列表框等,可以通过创建这些控件来构建丰富的用户界面。
同时,可以使用布局管理技术来控制控件的位置和大小,以实现界
面的美观和合理布局。
3. 图形绘制,Win32 API允许开发者直接操作图形设备接口(GDI),从而实现自定义的图形绘制功能。
通过GDI可以绘制各种
图形、文本和图像,实现丰富多彩的界面效果。
4. 用户交互,Win32界面编程可以实现丰富的用户交互功能,
比如鼠标点击、键盘输入、菜单操作等。
通过响应用户的交互行为,
可以让应用程序更加灵活和易用。
5. 窗口管理,Win32 API提供了丰富的窗口管理功能,比如最大化、最小化、关闭窗口等。
开发者可以通过这些功能来管理应用程序的窗口,提升用户体验。
总之,Win32界面编程可以实现丰富多彩的Windows应用程序界面。
开发者可以通过灵活运用Win32 API提供的功能,创建出符合自己需求的界面效果。
希望以上实例可以帮助你更好地理解
Win32界面编程。
控制台下用Win32API打开文件对话框
控制台下用Win32API打开文件对话框在控制台下打开对话框?!没错,这是完全可以的,实现起来也是相当简单,基本上连雕虫小技都不算。
不过网上这样的例子还不是很多,我就把自己写的一个demo贴上来。
参考了大名鼎鼎的《windows程序设计》中的一点代码。
[cpp]view plaincopy1.#include <Windows.h>2.#include <CommDlg.h>3.#include <iostream>4.ing namespace std;6.7.static OPENFILENAME ofn ;8.9.void PopFileInitialize (HWND hwnd)10.{11.static TCHAR szFilter[] = TEXT ("所有图片文件\0*.bmp;*.dib;*.jpg;*.jpeg;*.jpe;*.gif;*.tiff;*.png;*.ico\0") \12.TEXT ("JPEG文件 (*.jpg;*.jpeg;*.jpe)\0*.jpg;*.jpeg;*.jpe\0") \13.TEXT ("位图文件 (*.bmp;*.dib)\0*.bmp;*.dib\0") \14.TEXT ("GIF (*.gif)\0*.gif\0") \15.TEXT ("TIFF (*.tiff)\0*.tiff") \16.TEXT ("PNG (*.png)\0*.png") \17.TEXT ("ICO (*.ico)\0*.ico\0\0");18.19.ofn.lStructSize = sizeof (OPENFILENAME) ;20.ofn.hwndOwner = hwnd ;21.ofn.hInstance = NULL ;22.ofn.lpstrFilter = szFilter ;23.ofn.lpstrCustomFilter = NULL ;24.ofn.nMaxCustFilter = 0 ;25.ofn.nFilterIndex = 0 ;26.ofn.lpstrFile = NULL ; // Set in Open and Cl ose functions27.ofn.nMaxFile = MAX_PATH ;28.ofn.lpstrFileTitle = NULL ; // Set in Open and Cl ose functions29.ofn.nMaxFileTitle = MAX_PATH ;30.ofn.lpstrInitialDir = NULL ;31.ofn.lpstrTitle = NULL ;32.ofn.Flags = 0 ; // Set in Open and Close functions33.ofn.nFileOffset = 0 ;34.ofn.nFileExtension = 0 ;35.ofn.lpstrDefExt = TEXT ("jpg") ;36.ofn.lCustData = 0L ;37.ofn.lpfnHook = NULL ;38.ofn.lpT emplateName = NULL ;39.}40.41.BOOL PopFileOpenDlg (HWND hwnd, PTSTR pstrFileN ame, PTSTR pstrTitleName)42.{43.ofn.hwndOwner = hwnd ;44.ofn.lpstrFile = pstrFileName ;45.ofn.lpstrFileTitle = pstrTitleName ;46.ofn.Flags = OFN_HIDEREADONLY | OFN_CREAT EPROMPT ;47.48.return GetOpenFileName (&ofn) ;49.}50.51.int main()52.{53.static TCHAR szFileName[MAX_PATH], szTitleName[ MAX_PATH] ;54.HWND hwnd;55.hwnd=GetForegroundWindow(); //获取前台窗口句柄。
c语言编写win32程序
c语言编写win32程序C语言是一种广泛应用于编程领域的高级程序设计语言,而Win32则是指在Windows操作系统中使用C语言编写的程序。
本文将详细介绍如何使用C语言编写Win32程序,并探讨其相关知识和技巧。
我们需要了解Win32编程的基础知识。
Win32是Windows操作系统的一套API(应用程序编程接口),它提供了一组函数和数据结构,用于实现图形界面、文件操作、网络通信等功能。
在Win32编程中,我们需要熟悉这些API并学会如何调用它们来实现所需的功能。
在开始编写Win32程序之前,我们需要安装一个编译器,例如微软的Visual Studio。
安装完成后,我们就可以创建一个新的Win32项目,并开始编写代码了。
在编写Win32程序时,我们首先需要定义一个窗口类。
窗口类是窗口的模板,用于定义窗口的属性和行为。
我们可以使用Win32 API 中的RegisterClass函数来注册窗口类,并指定窗口的样式、消息处理函数等。
注册完成后,我们就可以使用CreateWindow函数来创建窗口实例,并显示在屏幕上。
创建窗口后,我们还需要处理窗口的消息。
在Win32编程中,窗口和其他组件之间通过消息进行通信。
当窗口接收到消息时,会调用相应的消息处理函数来处理该消息。
我们可以在消息处理函数中编写逻辑代码,对不同的消息进行不同的处理。
例如,当用户点击窗口的关闭按钮时,窗口会接收到WM_CLOSE消息,我们可以在消息处理函数中编写代码来响应该消息,并执行相应的操作。
除了处理消息外,我们还可以在Win32程序中添加其他功能。
例如,我们可以使用GDI(图形设备接口)来绘制图形和文字,使用文件操作函数来读写文件,使用网络通信函数来实现网络功能等。
通过调用这些函数,我们可以实现各种各样的功能,使我们的Win32程序变得更加强大和实用。
在编写Win32程序时,我们需要注意一些常见的问题。
首先,我们需要遵循Win32编程的规范和约定,例如使用正确的数据类型、遵循消息处理函数的约定等。
创建第一个CWin32控制台应用程序
创建第一个C++的Win32控制台应用程序
1.打开VS2008,依次选择菜单:文件--→新建--→项目。
2.在新建项目窗口中,依次选择项目类型中的其他语言--→Visual C++ ----→Win32,选择模板中的Win32控制台应用程序。
在名称栏中输入项目名称 Win32ConsoleApplicaiton,项目所在位置可单击浏览按钮选择目录位置。
选择完毕后,单击确定按钮。
3.在Win32应用程序向导中单击“下一步”
4.不用修改任何选项,单击“下一步”
5. 右侧是解决方案的资源管理器,双击文件名可以打开相应文件。
找到相应的main函数。
6.在main函数中输入相应的代码。
7.stdafx.h的作用,当我们使用AppWizard来自动生成某些项目的时候,系统会自动把所需要include的头文件在stdafx.h中先include一下,这样,我们只需要直接include这个stdafx.h 文件即可.因为同一个项目中的不同源文件CPP都包含相同的include文件,这样,为每个.CPP 文件都重复include这些文件就显得很傻了。
所以,在stdafx.h中填写头部文件。
在有main函数的文件中在添加代码:#include
“stdafx.h”即可。
8.按“Ctrl+F5”可以查看运行结果。
如果按F5或单击工具栏中的“”可以进行调试,
但无法保留最终运行结果。
C语言调用WIN32API学习之1创建窗口
C语⾔调⽤WIN32API学习之1创建窗⼝本学习笔记基于VC++6.0开发环境,通过c语⾔编程语⾔,调⽤win32 API进⾏windows系统应⽤程序开发。
1,打开VC++6.0,点击⽂件->新建->⼯程->Win32 Application ⼯程名填写example1,点击确定,选择⼀个空⼯程,点击完成。
2,点击"新建⽂件" 按钮,新建⼀个空⽩⽂件,点击⽂件->另存为输⼊⽂件名example1.c 选择⼯作空间对应的⽂件夹,保存。
3,点击FileView,右击Source File,点击添加⽂件到⽬录,选择example1.c,点击确定。
4,添加代码#include <windows.h>#include <Shlwapi.h>LRESULT CALLBACK WinSunProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam); //声明消息回调函数int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPreInstance,PTSTR szCmdLine,int iCmdShow) //Win32 Api 主程序函数⼊⼝{WNDCLASS wndcls; //定义窗体类HWND hwnd; //定义句柄⽤来保存成功创建窗⼝后返回的句柄MSG msg; //定义消息结构体变量wndcls.cbClsExtra=0; //结构体后附加的字节数,⼀般总为0wndcls.cbWndExtra=0; //窗体实例附加的字节数,⼀般总为0wndcls.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH); //背景颜⾊wndcls.hCursor=LoadCursor(NULL,IDC_ARROW); //光标句柄wndcls.hIcon=LoadIcon(NULL,IDI_APPLICATION); //图标句柄任务栏显⽰的图标wndcls.hInstance=hInstance; //模块句柄wndcls.lpfnWndProc=WinSunProc; //函数指针,指向处理窗⼝消息的函数⼊⼝wndcls.lpszClassName="windows"; //⾃定义类名,不要与其他类名重复wndcls.lpszMenuName=NULL; //菜单名的字符串wndcls.style=CS_HREDRAW | CS_VREDRAW; //指定窗⼝风格详见参数注释1if (!RegisterClass (&wndcls))return 0; //注册窗体类,如果失败直接返回0结束程序hwnd=CreateWindow("windows","创建⼀个新窗⼝",WS_OVERLAPPEDWINDOW,0,0,300,150,NULL,NULL,hInstance,NULL);//创建窗体//APIWS_OVERLAPPEDWINDOW为 Window Styles //详见参数注释2ShowWindow(hwnd,SW_SHOWNORMAL);//显⽰窗体的API 传⼊需要显⽰的窗体句柄和显⽰⽅式UpdateWindow(hwnd);//刷新窗体的APIwhile(GetMessage(&msg,NULL,0,0))//进⼊消息循环{TranslateMessage(&msg);//将虚拟键消息转换为字符消息。
Win32控制台程序是什么
Win32控制台程序是什么刚接触Windows那一套,大多数概念都还没建立起来,整理了一下网上对“Win32控制台程序”的理解,谢谢各位网友了。
win32控制台项目指在32位Windows命令提示符(即所谓的dos)环境下运行的应用程序...win32项目指运行于32位Windows操作系统中的应用程序...包括win32控制台项目...1、Win32项目包括:Win32 应用程序、控制台应用程序、DLL 或其他静态库的项目;2、控制台应用程序通常被设计为没有图形用户界面,并编译成独立的可执行文件。
控制台应用程序通常从命令行运行,同时在命令提示和运行的应用程序之间交换输入和输出信息。
win32应用程序是有窗体的(当然也可以没有),有Windows消息循环机制的。
而win32控制台应用程序只是在控制台下运行的程序,类似以前dos的程序。
可以在VC里建一个win32 application和一个win32 console application,两个dsp工程文件对比一下,你会发现应用程序里的subsystem:windows,控制台程序里的subsystem:console。
subsystem这个链接选项告诉Windows如何运行可执行文件。
subsystem是console的话,Windows在进入可执行文件的代码前,就会产生一个控制台窗口。
subsystem是windows的话,操作系统就不产生console窗口,该应用程序的窗口由用户自己创建。
可以调用GUI里面的API的,如果你看了一些VC的启动代码(就是main,WinMain,DllMain 之前的代码)就知道控制台程序在启动代码中多了取得标准输入输出句柄以及将程序参数转化成C语言格式的参数形式控制台程序就是通过命令行的方式进行输入和输出的Win32程序是它的上层概念,Win32程序可以是Console的也可以是GUI的Win32 程序:利用Windows编译器、连接器做出来的程序,都是所谓的Win32程序。
如何建立一个Win32 Console程序
如何建立一个Win32 Console程序注:本文中涉及的某些专有名词,请以后上课听老师的讲解,这里不再一一作解首先新建一个工程(也就是一个新程序),如图一:选择需要创建Win32 Console Application程序,并填上工程名(Project Name),这里我用myezwin作为工程名(名字随便起,是由你定的),点确定。
如图二:建立一个空的程序即可,点[Finish]。
如图三:之后,你会看到如下一个对话框(Dialog Box),显示与这个工程有关的一些信息(读读它上面写的英文就知道了)。
不管它,点OK即可。
如图四:建好工程(Project)后,还需要建一个程序的源文件(C++ Source File)。
从菜单(menu)选择[Fils]->[New…](如图一),接着选择C++ Source File,并将Add to project打上小勾(将你新建的文件加入特定的工程,一般这一步已经默认),然后给你的文件起个名字,这里就叫main吧,最后OK完成。
如图五:All right,程序建立完成,你可看到如图六的情况。
好,我们来写一个简单的程序试试。
如图七:程序内容:#include <iostream>using namespace std;int main(){cout << "Hello world!" << endl;return 0;}接下来,编译并连接(Compile and Link,也叫Build)你的程序。
如图八:图八的位置所在如下图所示:OK,运行你的程序看看吧。
关闭一个工程:如图九。
工程关闭后,你就可以建立其它的工程编写别的程序了。
Author: KasiDate: 2003.7.14Revision: 2003.10.8。
隐藏win32控制台程序的窗口
隐藏win32控制台程序的窗口#pragma comment( linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"" )就可以了。
此种方法是通过设置编译器的链接开关来实现,所以让我们来看一下编译器的链接开关选项(也就是linker选项).首先我们来看一下linker的/subsystem选项:该选项的语法形式如下:/SUBSYSTEM:{CONSOLE|EFI_APPLICATION|EFI_BOOT_SERVI CE_DRIVER|EFI_ROM|EFI_RUNTIME_DRIVER|NATIVE|POSIX|WIND OWS|WINDOWSCE} [,major[.minor]]这个链接选项告诉操作系统如何运行可执行文件CONSOLE:win32字符模式应用程序,此种类型的应用程序在运行的时候会产生一个类似DOS 窗口的控制台窗口,如果在应用程序的主函数为main()或者wmain(),在默认情况下该应用程序就是一个控制台应用程序WINDOWS:类型的应用程序不产生console窗口,该类型的应用程序的窗口由用户自己创建。
简而言之就是一个标准的Win32 application,其入口地址为WinMain()函数或者wWinMain()函数的地址。
如果你在应用程序中定义的主函数为WinMain或者wWinMain,在默认情况下该应用程序就是一个Win32 Application。
从上面可以看出如果我们建立一个win32 console application的话,linker的/subsystem选项应该为CONSOLE,可以在VC开发环境的project->setting->link->project option中看到!我们知道用VC编写的程序,运行的时候是需要C\C++运行库支持的.当我们运行一个C/C++程序的时候链接器会首先寻找应用程序的启动函数,例如你建立了一个console程序的话,编译器得链接开关会是以下这种形式/subsystem:"console" /entry:"mainCRTStartup" (ANSI)/subsystem:"console" /entry:"wmainCRTStartuup" (UNICODE)如果你建立了一个win32 application,编译器得链接开关则会是一下形式/subsystem:"windows" /entry:"WinMain" (ANSI)/sbusystem:"windows" /entry:"wWinMain" (UINCODE)上面的两种形式可以再project->setting->link->project option 中看到。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
如何为一个win32的程序添加控制台窗口?XDE(Xanavi Development Enveriment)的在PC机上运行的时候,除了模拟导航仪屏幕的对话框窗口外,还有一个用来协助调试的控制台(console)窗口。
这个console窗口可以用来输入调试命令,也可以进行打屏输出以观察程序的运行状态,非常方便。
这样做有两个好处:一、console窗口的输入输出速度比一般的windows窗口要快;二、console窗口的输入输出不会对消息流产生影响(你知道,就像dos窗口不知道消息的存在一样,console 窗口也具有这样的特性),而在一般的windows窗口上进行输入输出时,会打乱原有的消息流(因为会有一大堆的像WM_PAINT、WM_GETFOCUS这样与鼠标、焦点、键盘、刷新相关的消息产生)。
对于调试与消息相关的程序来说(比如像XDE这样拥有自己消息控制的程序),console这样的特性是非常重要的。
在windows系统下使用C/C++编程的时候,我们一般会有两种选择,一个是做成类似DOS字符界面样式的程序(这就是console程序),这种程序的入口函数是main(对于UNICODE则是wmain),另一种是做成win32窗口程序,这样的程序会产生标准的windows 窗口,它的入口函数是WinMain 。
一般来讲,一个win32的窗口程序在默认状态下是不会产生console窗口的。
但是,对于一个win32窗口程序,我们可以在运行期间给这个程序添加一个控制台窗口。
有几个win32的API是用来实现这个功能的:AllocConsole,FreeConsole以及与Console相关的Get和Set系列函数。
AllocConsole用来产生一个窗口,FreeConsole用来销毁它。
下面我们来具体地看看每一个函数的作用。
与Console窗口相关的API函数介绍:BOOL AllocConsole(void)这个函数为调用它的进程产生一个console窗口,如果成功,就返回非0值;否则,返回0。
要注意的是,每个进程最多只有拥有一个console的窗口(但多个进程可能同时拥有一个console窗口,比如子进程可以共享父进程的console窗口),如果这个进程已经有一个console窗口了,那么再调用AllocConsole的时候它会返回0。
BOOL FreeConsole(void)销毁进程所拥有的console窗口(如果这个console是被多个进程共同拥有,那么它不会被Free掉,但是调用此函数的进程将无法再访问到这个console了)。
成功返回非0值,否则返回0 。
HANDLE GetStdHandle(DWORD nStdHandle);nStdHandle:取STD_INPUT_HANDLE、STD_OUTPUT_HANDLE、STD_ERROR_HANDLE 三个值中的一个。
STD_INPUT_HANDLE:标准输入设备句柄STD_OUTPUT_HANDLE:标准输出设备句柄STD_ERROR_HANDLE:标准错误输出设备句柄。
这个函数用来获取标准输入、输出、错误输出设备的句柄。
这些句柄是某些console相关的函数上会用到,比如下面几个函数。
BOOL WriteConsole(HANDLE hConsoleOutput, // 控制台窗口输出句柄const VOID* lpBuffer, // 需要输出的字符所在的buffer addressDWORD nNumberOfCharsToWrite, // 需要输出的字符个数LPDWORD lpNumberOfCharsWritten, // 实际被输出的字符个数LPVOID lpReserved // 保留用,必须为NULL);这个函数用来向console窗口的输入缓冲区中写入字符串。
BOOL WriteConsoleInput(HANDLE hConsoleInput, // 控制台窗口输出句柄const INPUT_RECORD* lpBuffer, // 需要输出的字符所在的buffer addressDWORD nLength, // 需要输出的字符个数LPDWORD lpNumberOfEventsWritten // 实际被输出的字符个数);功能与上一个函数类似,只是它不写入缓冲区而是直接写到输出设备上。
BOOL ReadConsole(HANDLE hConsoleInput, // 控制台窗口输入句柄LPVOID lpBuffer, // 需要输入的字符存放的buffer addressDWORD nNumberOfCharsToRead, // 需要输入的字符个数LPDWORD lpNumberOfCharsRead, // 实际被输入的字符个数LPVOID lpReserved // 保留用,必须为NULL);这个函数用来从console窗口的输入字符。
BOOL ReadConsoleInput(HANDLE hConsoleInput, // 控制台窗口输入句柄PINPUT_RECORD lpBuffer, // 需要输入的字符存放的buffer addressDWORD nLength, // 需要输入的字符个数LPDWORD lpNumberOfEventsRead // 实际被输入的字符个数);功能与上一个函数类似,如果输入函数中包含除键盘之外的输入事件(如窗口的大小变化、鼠标事件)时,用ReadConsole 无法读入,只能使用ReadConsoleInput 读入。
虽然使用这几个API可以为win32产生一个控制台窗口,并在这个窗口中进行输入和输出。
但是仅仅这样做的话,便不能使用标准C函数库的输入输出系列的函数(如printf、scanf、gets等),而只能使用WriteConsole这类win32函数向这个窗口进行输出,使用ReadConsole这类win32函数来从控制台窗口得到输入。
但是这样会有一些问题:最重要的是WriteConsole、ReadConsole等几个函数没有printf系列的函数那样方便灵活,因为它们不能像printf系列函数那样对字符串进行格式化,而且WriteConsole、ReadConsole等几个函数的输入参数使用起来也不那么方便,比如要得到控制台窗口的句柄等等。
另外,对于构建在系统的上层的部分(如HMI)来说,使用标准C是一个很重要的选择――这样HMI层(包括它的调试代码部分)才能与平台无关。
所以我们需要将标准C的输入输出流与生成的控制台窗口绑定到一起去,或者说,把标准C的输入输出流重定向到用AllocConsole生成的控制台窗口中去。
标准C的输入输出在内部是使用stdin、stdout、stderr来进行的。
这三者实际上是三个FILE *类型的指针。
这三个指针所指向的三个FILE类型的数据存储着标准输入输出流的对象(即从何处输入,输出到何处)的信息。
通常情况下,stdin绑定在键盘设备上,stdout、stderr则绑定在标准输出屏幕。
当我们需要将标准C的输入输出进行重定向的时候,就需要将它们(可以看作是标准C的输入输出句柄)与Alloc出来的控制台窗口的句柄联系起来,使得在使用标准C的IO库函数时,这些函数在内部最终把输入输出动作转交给了Win32的API来做。
输入输出重定向需要用到VC运行时函数库提供的_open_osfhandle()函数(使用这个函数打开的文件要用_close来关闭),先来介绍一下这个函数:int _open_osfhandle (intptr_t osfhand le, // 操作系统的文件句柄int flags //);flags参数可以用下面几个值:●_O_APPEND:Positions a file pointer to the end of the file before every write operation.●_O_RDONL Y:Opens the file for reading only.●_O_TEXT :Opens the file in text (translated) mode.重定向的步骤用代码表示是这样的://将STDOUT 重定向到consolelStdHandle = (long)GetStdHandle(STD_OUTPUT_HANDLE);hConHandle = _open_osfhandle(lStdHandle, _O_TEXT);fp = _fdopen( hConHandle, "w" );*stdout = *fp;setvbuf( stdout, NULL, _IONBF, 0 );// 将STDIN重定向到consolelStdHandle = (long)GetStdHandle(STD_INPUT_HANDLE);hConHandle = _open_osfhandle(lStdHandle, _O_TEXT);fp = _fdopen( hConHandle, "r" );*stdin = *fp;setvbuf( stdin, NULL, _IONBF, 0 );//将STDERR重定向到consolelStdHandle = (long)GetStdHandle(STD_ERROR_HANDLE);hConHandle = _open_osfhandle(lStdHandle, _O_TEXT);fp = _fdopen( hConHandle, "w" );*stderr = *fp;setvbuf( stderr, NULL, _IONBF, 0 );这样标准C的输入输出就重定向到Alloc出来的Console窗口中了,可以使用printf等进行输入和输出操作。
后记:一般使用控制台进行调试的时候,控制台输入输出需要另外启动一个线程来进行操作,这样才不会影响到被调试的程序。
其它线程在使用控制台进行信息输入输出的时候,也要稍微地注意避免出现线程之间的race condition 。
附件中有一个例子程序(Win32Console.rar),以最简单的形式演示了上述的方法,程序运行后的界面如下图所示:说明:程序在CWin32ConsoleDlg::OnInitDialog中用RedirectIOToConsole函数生成一个控制台并将标准C的输入输出重定向到这个console窗口上。
然后再启动一个以ThreadProc 函数为招待代码的线程不断地处理输入,使console窗口中出符SIM>字样的提示符。