如何将vfp中的表单以图片的格式插入word文档?

myh2514 2007-03-28 03:05:44
如题
...全文
698 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
都市流浪者 2007-04-02
  • 打赏
  • 举报
回复
手工截取屏幕图象比较好理解一点:)
jackeyabc 2007-03-29
  • 打赏
  • 举报
回复
先收藏
myh2514 2007-03-28
  • 打赏
  • 举报
回复
apple_8180(十豆三) ( ) 信誉:443 Blog
-------------
太牛了吧!
你真我偶像!!!!!!!!!
十月鹰飞 2007-03-28
  • 打赏
  • 举报
回复
够强,学习了。。
十豆三 2007-03-28
  • 打赏
  • 举报
回复
保存当前一个窗口到一个bmp文件后再调用Word,将图片插入即可。
十豆三 2007-03-28
  • 打赏
  • 举报
回复
PROCEDURE Ptr2File (hFile, lnPointer, lnBt2Write)
* appends memory block to a file
DECLARE INTEGER WriteFile IN kernel32;
INTEGER hFile, INTEGER lpBuffer, INTEGER nBt2Write,;
INTEGER @lpBtWritten, INTEGER lpOverlapped

= WriteFile (hFile, lnPointer, lnBt2Write, 0, 0)
RETURN

PROCEDURE MakeSnapshot()
#DEFINE SRCCOPY 13369376
LOCAL hwnd, hdc, hSavedBitmap

hwnd = GetFocus()
hdc = GetWindowDC(hwnd)
= GetWinRect(hwnd, @lnWidth, @lnHeight)

hMemDC = CreateCompatibleDC (hdc)
hMemBmp = CreateCompatibleBitmap (hdc, lnWidth, lnHeight)

hSavedBitmap = SelectObject (hMemDC, hMemBmp)
= BitBlt (hMemDC, 0,0, lnWidth,lnHeight, hdc, 0,0, SRCCOPY)
= SelectObject (hMemDC, hSavedBitmap)
= ReleaseDC (hwnd, hdc)
RETURN

PROCEDURE GetWinRect(hwnd, lnWidth, lnHeight)
#DEFINE MAX_DWORD 4294967295 && 0xffffffff
LOCAL lpRect, lnLeft, lnTop, lnRight, lnBottom
lpRect = Repli(Chr(0), 16)
= GetWindowRect (hwnd, @lpRect)

lnLeft = buf2dword(SUBSTR(lpRect, 1,4))
lnTop = buf2dword(SUBSTR(lpRect, 5,4))
lnRight = buf2dword(SUBSTR(lpRect, 9,4))
lnBottom = buf2dword(SUBSTR(lpRect, 13,4))

IF lnLeft > lnRight
lnLeft = lnLeft - MAX_DWORD
ENDIF
IF lnTop > lnBottom
lnTop = lnTop - MAX_DWORD
ENDIF

lnWidth = lnRight - lnLeft
lnHeight = lnBottom - lnTop
RETURN

FUNCTION num2dword (lnvalue)
#DEFINE m0 256
#DEFINE m1 65536
#DEFINE m2 16777216
LOCAL b0, b1, b2, b3
b3 = Int(lnvalue/m2)
b2 = Int((lnvalue - b3*m2)/m1)
b1 = Int((lnvalue - b3*m2 - b2*m1)/m0)
b0 = Mod(lnvalue, m0)
RETURN Chr(b0)+Chr(b1)+Chr(b2)+Chr(b3)

FUNCTION num2word (lnvalue)
RETURN Chr(MOD(m.lnvalue,256)) + CHR(INT(m.lnvalue/256))

FUNCTION buf2dword (lcBuffer)
RETURN Asc(SUBSTR(lcBuffer, 1,1)) + ;
Asc(SUBSTR(lcBuffer, 2,1)) * 256 +;
Asc(SUBSTR(lcBuffer, 3,1)) * 65536 +;
Asc(SUBSTR(lcBuffer, 4,1)) * 16777216

FUNCTION buf2word (lcBuffer)
RETURN Asc(SUBSTR(lcBuffer, 1,1)) + ;
Asc(SUBSTR(lcBuffer, 2,1)) * 256

PROCEDURE decl
DECLARE INTEGER GetDIBits IN gdi32;
INTEGER hdc, INTEGER hbmp, INTEGER uStartScan,;
INTEGER cScanLines, INTEGER lpvBits, STRING @lpbi,;
INTEGER uUsage

DECLARE INTEGER GlobalAlloc IN kernel32 INTEGER wFlags, INTEGER dwBytes
DECLARE INTEGER GetWindowRect IN user32 INTEGER hwnd, STRING @lpRect
DECLARE INTEGER SelectObject IN gdi32 INTEGER hdc, INTEGER hObject
DECLARE INTEGER ReleaseDC IN user32 INTEGER hwnd, INTEGER hdc
DECLARE INTEGER DeleteDC IN gdi32 INTEGER hdc
DECLARE INTEGER GetFocus IN user32
DECLARE INTEGER GetWindowDC IN user32 INTEGER hwnd
DECLARE INTEGER GlobalFree IN kernel32 INTEGER hMem
DECLARE INTEGER DeleteObject IN gdi32 INTEGER hObject
DECLARE INTEGER CreateCompatibleDC IN gdi32 INTEGER hdc
DECLARE INTEGER CloseHandle IN kernel32 INTEGER hObject

DECLARE RtlZeroMemory IN kernel32 As ZeroMemory;
INTEGER dest, INTEGER numBytes

DECLARE INTEGER CreateCompatibleBitmap IN gdi32;
INTEGER hdc, INTEGER nWidth, INTEGER nHeight

DECLARE INTEGER BitBlt IN gdi32;
INTEGER hDestDC, INTEGER x, INTEGER y,;
INTEGER nWidth, INTEGER nHeight, INTEGER hSrcDC,;
INTEGER xSrc, INTEGER ySrc, INTEGER dwRop

DECLARE INTEGER CreateFile IN kernel32;
STRING lpFileName, INTEGER dwDesiredAccess,;
INTEGER dwShareMode, INTEGER lpSecurityAttr,;
INTEGER dwCreationDisp, INTEGER dwFlagsAndAttrs,;
INTEGER hTemplateFile

*** The structures used in this code:
*| typedef struct tagBITMAPINFOHEADER{
*| DWORD biSize; 0:4
*| LONG biWidth; 4:4
*| LONG biHeight; 8:4
*| WORD biPlanes; 12:2
*| WORD biBitCount; 14:2
*| DWORD biCompression; 16:4
*| DWORD biSizeImage; 20:4
*| LONG biXPelsPerMeter; 24:4
*| LONG biYPelsPerMeter; 28:4
*| DWORD biClrUsed; 32:4
*| DWORD biClrImportant; 36:4 = 40 bytes
*| } BITMAPINFOHEADER, *PBITMAPINFOHEADER

*| typedef struct tagRGBQUAD {
*| BYTE rgbBlue;
*| BYTE rgbGreen;
*| BYTE rgbRed;
*| BYTE rgbReserved;
*| } RGBQUAD; total 4 bytes

*| typedef struct tagBITMAPINFO {
*| BITMAPINFOHEADER bmiHeader;
*| RGBQUAD bmiColors[1];
*|} BITMAPINFO, *PBITMAPINFO;

*| typedef struct tagBITMAPFILEHEADER {
*| WORD bfType; 0:2
*| DWORD bfSize; 2:4
*| WORD bfReserved1; 6:2
*| WORD bfReserved2; 8:2
*| DWORD bfOffBits; 10:4 = 14 bytes
*| } BITMAPFILEHEADER, *PBITMAPFILEHEADER;
十豆三 2007-03-28
  • 打赏
  • 举报
回复
*WIN API-保存当前一个窗口到一个bmp文件

*----------------------------------------------------

*你可以在command 窗口执行 bmpform.prg,不过最好在要保存的form调用这个子程序.
*bmpform.prg

********
DO decl

PRIVATE hMemDC, hMemBmp, lnWidth, lnHeight, lnBitsPerPixel,;
lnBytesPerScan, lcBFileHdr, lcBIHdr, lpBitsArray, lnBitsSize,;
lcRgbQuad, lnRgbQuadSize, lcBInfo, lnFileSize

STORE "" TO lcBIHdr, lcBInfo, lcRgbQuad
STORE 0 TO hMemDC, hMemBmp, lnWidth, lnHeight, lnFileSize,;
lnBitsPerPixel, lnBytesPerScan, lnRgbQuadSize, lpBitsArray, lnBitsSize

= MakeSnapshot()
= InitBitmapInfo()
= InitBitsArray()

#DEFINE DIB_RGB_COLORS 0
= GetDIBits (hMemDC, hMemBmp, 0, lnHeight, lpBitsArray,;
@lcBInfo, DIB_RGB_COLORS)

LOCAL lcFilename
**保存的文件名
lcFilename = "c:\myfile.bmp"

IF bmp2file (lcFilename)
ACTI SCREEN
? "file: ", lcFilename
? "Size: ", LTRIM(TRANS(lnFileSize, "999,999,999,999"))
? "Width: ", LTRIM(STR(lnWidth)) + " pixels"
? "Height: ", LTRIM(STR(lnHeight)) + " pixels"
? "Bits per pixel:", LTRIM(STR(lnBitsPerPixel))
ENDIF

= GlobalFree (lpBitsArray)
= DeleteObject (hMemBmp)
= DeleteDC (hMemDC)
RETURN && main

PROCEDURE InitBitmapInfo()
#DEFINE BI_RGB 0
#DEFINE RGBQUAD_SIZE 4 && RGBQUAD
#DEFINE BHDR_SIZE 40 && BITMAPINFOHEADER

* forcing 24-bit format
lnBitsPerPixel = 24
lnBytesPerScan = lnWidth * 3

* line width should be DWORD-aligned (4 bytes)
* important for 16- and 24-bit color palettes
IF Mod(lnBytesPerScan, 4) <> 0
lnBytesPerScan = lnBytesPerScan + 4 - Mod(lnBytesPerScan, 4)
ENDIF

* initializing BitmapInfoHeader structure
lcBIHdr = num2dword(BHDR_SIZE) + num2dword(lnWidth) +;
num2dword(lnHeight) + num2word(1) + num2word(lnBitsPerPixel) +;
num2dword(BI_RGB) + num2dword(0) + num2dword(0) + num2dword(0) +;
num2dword(0) + num2dword(0)

* creating a buffer for the color table
IF lnBitsPerPixel <= 8
lnRgbQuadSize = (2^lnBitsPerPixel) * RGBQUAD_SIZE
lcRgbQuad = Repli(Chr(0), lnRgbQuadSize)
ELSE
lnRgbQuadSize = 0
lcRgbQuad = ""
ENDIF

* merging two pieces together
lcBInfo = lcBIHdr + lcRgbQuad
RETURN

PROCEDURE InitBitsArray()
#DEFINE GMEM_FIXED 0
lnBitsSize = lnHeight * lnBytesPerScan
lpBitsArray = GlobalAlloc (GMEM_FIXED, lnBitsSize)
= ZeroMemory (lpBitsArray, lnBitsSize)

FUNCTION bmp2file (lcTargetFile)
* store all gathered pieces to a disk file
#DEFINE GENERIC_WRITE 1073741824 && 0x40000000
#DEFINE FILE_SHARE_WRITE 2
#DEFINE CREATE_ALWAYS 2
#DEFINE FILE_ATTRIBUTE_NORMAL 128
#DEFINE INVALID_HANDLE_value -1
#DEFINE BFHDR_SIZE 14 && BITMAPFILEHEADER

LOCAL hFile, lnOffBits

* resulting BMP file size
lnFileSize = BFHDR_SIZE + BHDR_SIZE + lnRgbQuadSize + lnBitsSize

* offset to the bitmap bits
lnOffBits = BFHDR_SIZE + BHDR_SIZE + lnRgbQuadSize

* BMP file header
lcBFileHdr = "BM" + num2dword(lnFileSize) +;
num2dword(0) + num2dword(lnOffBits)

* target file handle
hFile = CreateFile (lcTargetFile,;
GENERIC_WRITE,;
FILE_SHARE_WRITE, 0,;
CREATE_ALWAYS,;
FILE_ATTRIBUTE_NORMAL, 0)

IF hFile <> INVALID_HANDLE_value
* a straightforward process of storing block after block:
= String2File (hFile, @lcBFileHdr) && BitmapFileHeader
= String2File (hFile, @lcBInfo) && BitmapInfo
= Ptr2File (hFile, lpBitsArray, lnBitsSize) && bitmap data
= CloseHandle (hFile)
RETURN .T.
ELSE
= MessageB ("Unable to create file: " + lcTargetFile)
RETURN .F.
ENDIF

PROCEDURE String2File (hFile, lcBuffer)
* appends string buffer to a file
DECLARE INTEGER WriteFile IN kernel32;
INTEGER hFile, STRING @lpBuffer, INTEGER nBt2Write,;
INTEGER @lpBtWritten, INTEGER lpOverlapped

= WriteFile (hFile, @lcBuffer, Len(lcBuffer), 0, 0)
RETURN
青草根儿 2007-03-28
  • 打赏
  • 举报
回复
用ole试试
vf6.0,要考二级没系统的下哈 Microsoft Visual FoxPro 6.0 for Windows 的常见问题 这些是有关 Microsoft Visual FoxPro 最常见的问题。在您求助 Microsoft 产品支持服务之前,请先查阅这张列表。 若想打印这些附注,请从“文件”菜单选择“打印”命令。此文档分为以下四部分: --------------------------------------------------------------------- 部分 1. 技术支持与市场 部分 2. Visual FoxPro 6.0 新增功能 部分 3. 从其他版本的 FoxPro 和 Visual FoxPro 移植 部分 4. Visual FoxPro 常见问题 --------------------------------------------------------------------- 部分 1. 技术支持与市场 问题 1-1: 从何处可以获得产品的更新版本? 答案: 在 Visual FoxPro 的 Web 站点上即可获得产品的更新信息,其包括有关 Service Pack 和更新的示例、向导及其他代码的信息,该站点的网址为: www.microsoft.com/vfoxpro 请定期查看该网站,以便下载产品的最新版本。 问题 1-2: 从何处可以得到有关 Visual FoxPro 的详细资料? 答案: 通过 Microsoft Visual FoxPro Web 站点是随时获得各种最新产品发布信息的最佳途径。在此站点上不仅有新的产品公告,而且还提供了产品的更新信息、技术文章、白皮书、专业开发人员设计的优秀示例、会议公告、以及与其他许多 FoxPro web 站点的各种链接。 问题 1-3: 如何获得技术支持,以及如何报告软件错误? 答案: Microsoft Visual FoxPro Web 站点已经链接到了多种联机支持选项,其包括覆盖面广阔的有关所有产品 Microsoft Knowledge Base(Microsoft 知识库)。您还可以阅读一份有关常见问题的清单。除联机支持之外,还可以直接通过电话获得技术支持。“帮助”菜单的选项可列出技术支持的电话号码。这些电话号码也可用于报告产品的错误。 问题 1-4. 什么是 Knowledge Base?如何使用它? 答案: Knowledge Base 是内容广泛的论文集,覆盖了如何使用产品的各种特性、已知的软件错误及其解决方案或回避的方法、以及其他有助于使用各种 Microsoft 产品的有用信息。通过以下站点可访问整个 Knowledge Base: support.microsoft.com 问题 1-5: 是否会有 Visual FoxPro 6.0a? 答案: Microsoft 公司一向承诺为用户提供高质量的产品。如果确实需要,我们将提供 Visual FoxPro 6.0 的错误修订版。但是,修订版不会使用 6.0a 版的形式。Visual FoxPro 6.0 任何错误的修正都将包含在 Visual Studio Service Pack 。同时还会在 Visual FoxPro 的 www.microsoft.com/vfoxpro 或 Visual Studio 的www.microsoft.com/vstudio 的 Web 站点上发布修订公告。 问题 1-6: Microsoft 公司为应用程序的开发提供了一些优秀的解决方案。怎样才能知道应该向客户推荐和使用哪种产品? 答案: 在选择适用某项任务的产品时,需要考虑多方面的因素。Microsoft Visual FoxPro web 站点上有一份优秀的策略背景论文,它比较了 Visual FoxPro、Visual Basic、SQL Server 和 Access 等 Microsoft 产品之间的不同。 问题 1-7: 哪里可以找到 Visual FoxPro 的使用示例? 答案: Visual FoxPro 6.0 产品带有丰富的示例,其有一些是针对 6.0 版特有功能的新示例。与 Visual FoxPro 以前的版本不同,这些示例将与所有 Visual Studio 示例安装在一起。您必须运行 MSDN Library 的“自定义”安装来安装这些示例。在 Visual FoxPro 可使用新的 HOME(2) 函数方便地找到已安装示例的位置。 除了产品所自带的示例外,Microsoft Visual FoxPro web 站点还将经常提供新的示例。
第十章 常用的表单控件 VFP在面向对象开发环境,是通过在表 单上放置控件来完成信息的输入设计工作的。 在设计表单时可以使用两类控件:与表数据 捆绑的控件和不与数据捆绑的控件。所谓捆绑 控件是指当输入或选择的值要保存或者被引用 时,就需为该控件设置一个数据源,数据源可 以是表的字段或变量。对于数据源是变量或 字段的控件,则需要设置控件的ControlSource 属性;若数据源是整个表的数据,则需要设 置RecordSource属性。而非捆绑控件则不与数 据源直接捆绑。 10.1 标签控件(Label) 标签控件:它是一个显示文本图形的控件, 在设计时可以直接修改其的文本,标签具有自 己的一套属性、事件和方法,能够响应绝大多数 鼠标事件,可以在运行时动态地改变标签文本。 可以使用TabIndex属性为标签指定一个Tab次序, 但标签并不能获得焦点,而是将焦点传递给Tab 键次序紧跟着标签的下一个控件。 常用的标签属性: Caption属性 用于指定标签的标题文本,最多可包含的字 符数量为256。标签文本显示在屏幕上以帮助用 户识别各个对象。用户在产生表单或控件对象时, 系统给予对象的Caption属性值和Name属性值是 相同的,此时用户应特别注意它们的区别。 用户在为控件设置Caption属性时,可以将其 的某个字符作为热键,方法是在该字符前插入 一个反斜杠(\)和一个小于号(<)。 AutoSize属性 该属性用于确定是否根据标题的长度来调整 标签的大小。 Alignment属性 该属性指定标题文本在控件显示时的对齐 方式。对于不同的控件,该属性的设置是有区别 的。对于标签,该属性的设置值如下表所示。 设置值 说 明 0 (默认值)左对齐,文本显示在区域的 左边 1 右对齐,文本显示在区域的右边 2 央对齐,将文本居排放,使左右两 边的空白相等 BackStyle属性 该属性用于确定标签是否透明。当标签控件 完全处于另一个控件的上方时,标签将遮住下方 的控件,此时若标签控件的BackStyle属性设置为 0,则下方的控件将透过标签显示出来。 WordWrap属性 该属性用于确定标签上显示的文本能否换行。 前提是AutoSize属性值应设置为.T.。 FontSize属性 该属性确定标签上显示的文本字体的大小。 ForeColor属性 该属性用于确定标签上显示的文本字体的颜 色。 【例10.1】交换两个变量的数据(如下图1所示) 。 设计步骤如下: 建立应用程序用户界面。 选择"新建"表单,进入表单设计器,增加一 个命令按钮Command1,4个标签Label1、Label2、 Label3、Label4(如图10-3左所示)。 设置对象属性(如表10-2),设置完成之后的 界面如图10-3右所示。 编写程序代码。 *编写命令按钮Command1的Click事件代码: t= Thisform.Label3.Caption Thisform.Label3.Caption= Thisform.Label4.Caption Thisform.Label4.Caption=t 运行程序,单击"交换"按钮,即可看到两个白 框的数据相互交换。 例10.1 10.2 命令按钮控件(Command) 命令按钮一般是用于启动某一动作的事件 (如关闭表单、移动记录等)。这些事件的操作 代码通常是放置在命令按钮的Click事件。当用 户需要完成某项特定的操作时,可单击此命令按 钮。 常用属性: Default属性和Cancel属性 Default属性值为.T.的命令按钮称为"确认" 按钮。命令按钮的Default属性的默认值为.F.。一 个表单内只能有一个"确认"按钮,当用户将某 个命令按钮设置为"确认"按钮时,先前存在的 "确认"按钮将自动变为"非确认"按钮。 "确 认"按钮的行为要受到KEYCOMP设置(DOS或 WINDOWS)的影响。在"确认"按钮所在的表 单激活的情况下,"确认"按钮的行为如下表所 示。 设置值 效 果 DOS 按Ctrl+Enter,选择"确认"按钮、执行Click事件代码 WINDOWS 当焦点不在命令按钮上时,按Enter,选择"确认"按钮、 执行Click事件代码 Cancel属性值为.F.的命令按钮称为"取消" 按钮。命令按钮的Cancel属性默认值为.F.。在" 取消"按钮所在的表单激活的情况下。按Esc键即 可激活"取消"按钮,执行该按钮的Click事件代 码。 这两个属性在设计和运行阶段都可使用,主 要适用于命令按钮。 Enabled属性 指定表单或控件能否响应由用户引发的事件。 默认值为.T.,即对象是有效的,能被选择,能响应 用户引发的事件。 Enabled属性使得用户(程序

2,723

社区成员

发帖
与我相关
我的任务
社区描述
VFP,是Microsoft公司推出的数据库开发软件,用它来开发数据库,既简单又方便。
社区管理员
  • VFP社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧