澳门新葡亰信誉平台游戏实现打印编程

by admin on 2020年1月28日

Visual
C++6.0是开发Windows应用程序的强大工具,但是要通过它实现程序的打印功能,一直是初学者的一个难点,经常有朋友询问如何在VC中实现打印功能,他们往往感到在MFC提供的框架内实现这个问题很复杂,不知道如何下手。

配置文件中经常用到ini文件,在VC中其函数分别为:  

来源:Internet

 

 写入.ini文件:bool WritePrivateProfileString(LPCTSTR lpAppName,LPCTSTR
lpKeyName,LPCTSTR lpString,LPCTSTR lpFileName);  

配置文件字符串和 .INI 文件
Windows 3.x 应用程序能够直接访问 .INI 文件。然而,这些代码在 32 位
Windows 操作系统中不能使用,因为 .INI
文件中的信息被注册数据库替换。该数据库具有一些优点,包括防止应用程序损坏系统信息的安全控制、错误记录、远程软件更新和远程管理工作站软件。

本例针对这个问题,介绍一种简单的方法实现文字串的打印功能,读者朋友可以在此基础上稍微改动一下,就可以实现文件、图像的打印功能。

 读取.ini文件:DWORD GetPrivateProfileString(LPCTSTR lpAppName,LPCTSTR
lpKeyName,LPCTSTR lpDefaut,LPSTR lpReturnedString,DWORD nSize,LPCTSTR
lpFileName);   

可 以利用 Windows 3.x 和所有 32 位 Windows 操作系统支持的配置文件 API
编写可移植的代码。调用 GetProfileString 和 WriteProfileString API
函数,而不是直接访问 .INI
文件。这些函数使用编译环境支持的任何一个基础机制(.INI
文件或者注册数据库)。

   一、实现方法

读取整形值:UINT GetPrivateProfileInt(LPCTSTR lpAppName,LPCTSTR
lpKeyName,INT nDefault,LPCTSTR lpFileName);  

用Visual C++操作INI文件

  在Windows操作系统下,显示器、打印机和绘图仪都被视为输出设备,正常情况下,系统默认的输出设备是显示器。要使用打印机,首先需要创建一个指向打印机的设备环境句柄,然后通过该句柄调用相关的绘图函数把所需的文字和图形输出至打印机上。当打印结束后,删除这个设备环境句柄即可。

 其中个参数的意思:  

一.将信息写入.INI文件中.

  当Windows系统中安装好打印机后,系统总是自动设置一个打印机为系统的默认打印机,在Windows的启动配置文件Win.ini中的[window]段中列出了带有关键字device的默认打印机。下面是某一机器中Win.ini中的[Windows]字段的内容:

 LPCTSTR lpAppName ——- INI文件中的一个字段名   

  1.所用的WINAPI函数原型为:

[windows] load= run= NullPort=None device=HP LaserJet 4050(computer000),HPBFDB1,LPT1
  在上述关键字device后的字符串中,包含了系统中默认打印机的三个重要属性,它们依次是打印机的设备名HP
LaserJet 4050(computer000),驱动程序名是HPBFDB1,输出端口为LPT1。

LPCTSTR lpKeyName ——– lpAppName
下的一个键名,也就是里面具体的变量名

BOOL WritePrivateProfileString(
LPCTSTR lpAppName,
LPCTSTR lpKeyName,
LPCTSTR lpString,
LPCTSTR lpFileName
);

  为了操纵系统默认的打印机,实现程序的打印功能,在程序中可调用API函数GetProfileString()从Win.ini文件中获得device这个设备字符串,该函数的原型为:DWORD
GetProfileString( LPCTSTR lpAppName, LPCTSTR lpKeyName, LPCTSTR
lpDefault, LPTSTR lpReturnedString, DWORD
nSize)。函数中lpAppName参数为所要检索的Win.ini文件中的字段名;lpKeyName为字段中的关键字名;lpDefault为默认的字符串;lpReturnedString为检索到的字符串,如果该函数没有从lpKeyName关键字中检索到相应的字符串,则kpRetrunedString返回默认字符串lpDefault;nSize为返回字符串的长度。

  LPCTSTR lpString ———是键值,也就是变量的值,
必须为LPCTSTR或CString类型  

  其中各参数的意义:

  获取上述字符串后,再使用strtok()函数将该字符串进行分解,获得与打印机相关的三个属性,作为API函数CreateDC()创建打印机设备环境句柄的参数,CreateDC()函数如果调用成功,则为默认打印机创建一个设备环境句柄,否则返回一个空值(NULL)。该函数的原形为:HDC
CreateDC(LPCTSTR lpszDriver,LPCTSTR lpszDevice,LPCTSTR lpszOutput,CONST
DEVMODE
*lpinitData)。该函数的前三个参数恰好对应打印机的三个属性,最后一个参数为初始化打印机驱动程序的数据,一般情况下该参数设置为NULL就可以了。

 LPCTSTR lpFileName ——–完整的INI文件路径名   

   LPCTSTR lpAppName 是INI文件中的一个字段名.

  在具体打印的过程中,调用int StartDoc( HDC hdc, CONST DOCINFO *lpdi
)函数来开始一个打印任务,其中参数lpdi为一个指向DOCINFO结构的指针,该结构如下:

LPCTSTR lpDefaut ———-如果没有其前两个参数值,则将此值赋给变量  

   LPCTSTR lpKeyName 是lpAppName下的一个键名,通俗讲就是变量名.

typedef struct {  int cbSize; //结构的尺寸大小;  LPCTSTR lpszDocName; //文档的名字;  LPCTSTR lpszOutput; //输出文档名,一般情况下为NULL;  LPCTSTR lpszDatatype;//用来记录打印过程的数据类型,一般情况下为NULL;  DWORD fwType; //用来支持打印工作的额外信息,一般情况下为NULL; } DOCINFO, *LPDOCINFO;
  开始一个打印任务后,再调用StartPage(hdcprint)函数让打印机走纸,通知打印机有文档将要打印;接下来的工作就是输出数据了,这部分工作对于开发人员来说就象往计算机屏幕上输出文字、图像一样容易,只不过是计算机根据当前的设备环境句柄自动将数据输出到打印机罢了。数据打印完后,需要作一些善后处理工作,使用RestoreDC(hdcprint,-1)函数恢复打印机设备句柄、EndPage(hdcprint)函数让打印机停止打印,最后调用EndDoc(hdcprint)函数结束上述的打印作业。

 LPSTR lpReturnedString
——–接收INI文件中的值的CString对象,即接收缓冲区  

   LPCTSTR lpString
是键值,也就是变量的值,不过必须为LPCTSTR型或CString型的.

   二、编程步骤

 DWORD nSize ——接收缓冲区的大小  

   LPCTSTR lpFileName 是完整的INI文件名.

  1、启动Visual
C++6.0,新建一个基于对话框的应用程序Test,在程序的对话框窗体中加入一个按钮(Button),设置这个Button的属性:ID=IDC_PRINT,CAPTION=”打印”;

 例子:   

  2.具体使用方法:设现有一名学生,需把他的姓名和年龄写入
c:studstudent.ini 文件中.

  2、使用Class
Wizard类向导为该按钮添加一个鼠标单击处理函数OnPrint()

CString StrName,Strtemp;  

CString strName,strTemp;
int nAge;
strName=”张三”;
nAge=12;
::WritePrivateProfileString(“StudentInfo”,”Name”,strName,”c:\stud\student.ini”);

  3、修改TestDlg.cpp文件中的OnPrint()函数;

 int nAge;  

  此时c:studstudent.ini文件中的内容如下:

  4、添加代码,编译运行程序。

 StrName = “jacky”;  

   [StudentInfo]
   Name=张三

 nAge = 13;  

  3.要将学生的年龄保存下来,只需将整型的值变为字符型即可:

 WritePrivateProfileString(“Student”,”Name”,StrName,”c:\setting.ini”);
 

strTemp.Format(“%d”,nAge);
::WritePrivateProfileString(“StudentInfo”,”Age”,strTemp,”c:\stud\student.ini”);
 二.将信息从INI文件中读入程序中的变量.

 结果:(INI文件中显示如下:)

  1.所用的WINAPI函数原型为:

  [Student]

DWORD GetPrivateProfileString(
LPCTSTR lpAppName,
LPCTSTR lpKeyName,
LPCTSTR lpDefault,
LPTSTR lpReturnedString,
DWORD nSize,
LPCTSTR lpFileName
);

  Name=jacky  

  其中各参数的意义:

 读取:   

   前二个参数与 WritePrivateProfileString中的意义一样.

CString SName;

   lpDefault :
如果INI文件中没有前两个参数指定的字段名或键名,则将此值赋给变量.

  GetPrivateProfileString(“Student”,”Name”,”DefaultName”,SName.GetBuffer(MAX_LENGTH),MAX_LENGTH,”c:\setting.ini”);
 

   lpReturnedString : 接收INI文件中的值的CString对象,即目的缓存器.

 结果:SName = “jacky”;

   nSize : 目的缓存器的大小.

这里需要注意点就是用完GetBuffer函数后一定要释放(用SName.ReleaseBuffer()函数),不然后面再用到SName的其他子函数就会失灵。
  

   lpFileName : 是完整的INI文件名.

读整数比较简单,如下

  2.具体使用方法:现要将上一步中写入的学生的信息读入程序中.

  int Result =
GetPrivateProfileInt(“Student”,”nAge”,0,”c:\setting.ini”)返回值即为所读取的结果!

CString strStudName;
int nStudAge;
GetPrivateProfileString(“StudentInfo”,”Name”,”默认姓名”,strStudName.GetBuffer(MAX_PATH),MAX_PATH,”c:\stud\student.ini”);

  在GetPrivateProfileString最后一个参数是配置文件路径的参数,此路径只能是绝对路径,不能是相对路径,但现在我需要是我的exe文件能和我的配置文件在一起。因此我使用了GetCurrentDirectory函数。
  

  执行后 strStudName
的值为:”张三”,若前两个参数有误,其值为:”默认姓名”.

原代码如下:   

  3.读入整型值要用另一个WINAPI函数:

CString server_ip;  

UINT GetPrivateProfileInt(
LPCTSTR lpAppName,
LPCTSTR lpKeyName,
INT nDefault,
LPCTSTR lpFileName
);

 CString des=””;   

  这里的参数意义与上相同.使用方法如下:

::GetCurrentDirectory(MAX_PATHLENGTH,des.GetBuffer(MAX_PATHLENGTH));
 

nStudAge=GetPrivateProfileInt(“StudentInfo”,”Age”,10,”c:\stud\student.ini”);
三.循环写入多个值,设现有一程序,要将最近使用的几个文件名保存下来,具体程序如下:

 des.ReleaseBuffer();  

  1.写入:

 des+=”\config.ini”;  

CString strTemp,strTempA;
int i;
int nCount=6;
file://共有6个文件名需要保存
for(i=0;i {strTemp.Format(“%d”,i);
strTempA=文件名;
file://文件名可以从数组,列表框等处取得.
::WritePrivateProfileString(“UseFileName”,”FileName”+strTemp,strTempA,
“c:\usefile\usefile.ini”);
}
strTemp.Format(“%d”,nCount);
::WritePrivateProfileString(“FileCount”,”Count”,strTemp,”c:\usefile\usefile.ini”);
file://将文件总数写入,以便读出.

 GetPrivateProfileString(“PhoneDemo”,”Server_IP”,””,server_ip.GetBufferSetLength(15),15,des);

  2.读出:

  server_ip.ReleaseBuffer();  

nCount=::GetPrivateProfileInt(“FileCount”,”Count”,0,”c:\usefile\usefile.ini”);
for(i=0;i {strTemp.Format(“%d”,i);
strTemp=”FileName”+strTemp;
::GetPrivateProfileString(“CurrentIni”,strTemp,”default.fil”,
strTempA.GetBuffer(MAX_PATH),MAX_PATH,”c:\usefile\usefile.ini”);

 注意:在这里使用CString变量时,在使用完GetBuffer后,紧接着一定要使用ReleaseBuffer()函数,才可以进行其他的诸如字符串+操作
  转自CSDN-cherryt

file://使用strTempA中的内容.


}
补充几点:
   1.INI文件的路径必须完整,文件名前面的各级目录必须存在,否则写入不成功,该函数返回
FALSE 值.
   2.文件名的路径中必须为 \ ,因为在VC++中, \ 才表示一个 .
   3.也可将INI文件放在程序所在目录,此时 lpFileName 参数为:
“.\student.ini”.
          
4.从网页中粘贴源代码时,最好先粘贴至记事本中,再往VC中粘贴,否则易造成编译错误,开始时我也十分不解,好好的代码怎么就不对呢?后来才找到这个方法.还有一些代码中使用了全角字符如:<,\等,也会造成编译错误.

VC读取配置文件(.ini):

INI文件编程

CString strIP = _T(“”);

    
INI文件在系统配置及应用程序参数保存与设置方面,具有很重要的作用,所以可视化的编程一族,如VB、VC、VFP、Delphi等都提供了读写INI文件的方法,其中Delphi中操作INI文件,最为简洁,这是因为Delphi3提供了一个TInifile类,使我们可以非常灵活的处理INI文件。

CString strPort = _T(“”);

一、有必要了解INI文件的结构:
;注释
[小节名]
关键字=值

  INI文件允许有多个小节,每个小节又允许有多个关键字,
“=”后面是该关键字的值。
 
值的类型有三种:字符串、整型数值和布尔值。其中字符串存贮在INI文件中时没有引号,
布尔真值用1表示,布尔假值用0表示。
  注释以分号”;”开头。
二、定义
  1、在Interface的Uses节增加IniFiles;
  2、在Var变量定义部分增加一行:
myinifile:Tinifile;
  然后,就可以对变量myinifile进行创建、打开、读取、写入等操作了。

::GetPrivateProfileString(“TCP/IP”,”IP”,””,   
strIP.GetBuffer(MAX_PATH), MAX_PATH,”.\Config.ini”);

三、打开INI文件

strIP.ReleaseBuffer();

myinifile:=Tinifile.create(‘program.ini’);

m_strIP = strIP; //IP地址

  上面这一行语句将会为变量myinifile与具体的文件
program.ini建立联系,然后,就可以通过变量myinifile,来读写program.ini文件中的关键字的值了。值得注意的是,如果括号中的文件名没有指明路径的话,那么这个Program.ini文件会存储在Windows目录中,把Program.ini文件存储在应用程序当前目录中的方法是:为其指定完整的路径及文件名。下面的两条语句可以完成这个功能:

::GetPrivateProfileString(“TCP/IP”,”Port”,””,   
strPort.GetBuffer(MAX_PATH), MAX_PATH,”.\Config.ini”);

Filename:=ExtractFilePath(Paramstr(0))+’program.ini’;

strPort.ReleaseBuffer();

myinifile:=Tinifile.Create(filename);

m_iPort = atoi(strPort);   //端口号

四、读取关键字的值
 
针对INI文件支持的字符串、整型数值、布尔值三种数据类型,TINIfiles类提供了三种不同的对象方法来读取INI文件中关键字的值。
  假设已定义变量vs、vi、vb分别为string、 integer、boolean类型。  

配置文件名为:Config.ini 文件结构: [TCP/IP] IP=127.0.0.1 Port=8848

vs:=myinifile.Readstring(‘小节名’,’关键字’,缺省值);
vi:=myinifile.Readinteger(‘小节名’,’关键字’,缺省值);
vb:=myinifile.Readbool(‘小节名’,’关键字’,缺省值);

  其中缺省值为该INI文件不存在该关键字时返回的缺省值。

五、写入INI文件
 
同样的,TInifile类也提供了三种不同的对象方法,向INI文件写入字符串、整型数及布尔类型的关键字。  

myinifile.writestring(‘小节名’,’关键字’,变量或字符串值);
myinifile.writeinteger(‘小节名’,’关键字’,变量或整型数值);
myinifile.writebool(‘小节名’,’关键字’,变量或True或False);
  当这个INI文件不存在时,上面的语句还会自动创建该INI文件。
六、删除关键字
 
除了可用写入方法增加一个关键字,Tinifile类还提供了一个删除关键字的对象方法:
myinifile.DeleteKey(‘小节名’,’关键字’);

七、小节操作
  增加一个小节可用写入的方法来完成,删除一个小节可用下面的对象方法:
    myinifile.EraseSection(‘小节名’);
  另外Tinifile类还提供了三种对象方法来对小节进行操作:
 
myinifile.readsection(‘小节名’,TStrings变量);可将指定小节中的所有关键字名读取至一个字符串列表变量中;
 
myinifile.readsections(TStrings变量);可将INI文件中所有小节名读取至一个字符串列表变量中去。
 
myinifile.readsectionvalues(‘小节名’,TStrings变量);可将INI文件中指定小节的所有行(包括关键字、=、值)读取至一个字符串列表变量中去。

八、释放
在适当的位置用下面的语句释放myinifile:
myinifile.distory;
九、一个实例
 
下面用一个简单的例子(如图),演示了建立、读取、存贮INI文件的方法。myini.ini文件中包含有”程序参数”小节,和用户名称(字符串)、是否正式用户(布尔值)和已运行时间(整型值)三个关键字。程序在窗体建立读取这些数据,并在窗体释放时写myini.ini文件。
  附源程序清单
unit Unit1;
interface
uses
  
Windows,Messages,SysUtils,Classes,Graphics,Controls,Forms,Dialogs,inifiles,StdCtrls,ExtCtrls;

type
   TForm1 = class(TForm)
     Edit1: TEdit;
     CheckBox1: TCheckBox;
     Edit2: TEdit;
     Label1: TLabel;
     Label2: TLabel;
     Timer1: TTimer;
     Label3: TLabel;
     procedure FormCreate(Sender: TObject);
     procedure FormDestroy(Sender: TObject);
     procedure Timer1Timer(Sender: TObject);
   private
     { Private declarations }
   public
     { Public declarations }
   end;
var
   Form1: TForm1;

implementation
var
   myinifile:TInifile;
{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
var filename:string;
begin
   filename:=ExtractFilePath(paramstr(0))+’myini.ini’;
   myinifile:=TInifile.Create(filename);
   edit1.Text:=
myinifile.readstring(‘程序参数’,’用户名称’,’缺省的用户名称’);
   edit2.text:=
inttostr(myinifile.readinteger(‘程序参数’,’已运行时间’,0));
   checkbox1.Checked:=
myinifile.readbool(‘程序参数’,’是否正式用户’,False);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
   myinifile.writestring(‘程序参数’,’用户名称’,edit1.Text);

  
myinifile.writeinteger(‘程序参数’,’已运行时间’,strtoint(edit2.text));
   myinifile.writebool(‘程序参数’,’是否正式用户’,checkbox1.Checked);
   myinifile.Destroy;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
   edit2.Text:=inttostr(strtoint(edit2.text)+1);
end;

end.
  程序在Pwin95、Delphi3下调试通过

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图