display pdf winform c# : Rotate pages in pdf online application software cloud windows azure .net class 7053154973-Excel%202007%20VBA%20Programmers%20Reference%20-%20Wrox%20200764-part693

2002, so you only need to use FindWindow for the main Excel window if you want to be compatible with
Excel 2000 or earlier, or if you want to find the window handle for any other type of window (such as
UserForms). All of the code examples in this chapter use FindWindow, to be compatible with as many
versions of Excel as possible.
There are many different types of windows in Windows applications, ranging from Excel’s application
window to the windows used for dialog sheets, UserForms, ListBoxes, and buttons. Each type of win-
dow has a unique identifier, known as its class. Some common class names in Excel are outlined in the
following table.
Window
Class Name
Excel’s main window
XLMAIN
Excel desktop
XLDESK
Excel worksheet
EXCEL7
Excel UserForm
ThunderDFrame(since Excel 2000)
ThunderRT6DFrame(since Excel 2000, when
running as a COM Add-In)
ThunderXFrame(in Excel 97)
Excel status bar
EXCEL4
Excel chart window (prior to Excel 2007)
EXCELE
The FindWindowfunction uses this class name and the window’s caption to find the window.
Note that the class names for some of Excel’s standard items have changed with every release of Excel
(but very few between Excel 2000 and 2007). You therefore need to include version checking in your
code to determine which class name to use:
Select Case Val(Application.Version)
Case Is >= 9    ‘Use Excel 2000/2002/2003/2007 class names
Case Is >= 8    ‘Use Excel 97 class names
Case Else       ‘Use Excel 5/95 class names
End Select
This results in a potential forward-compatibility problem: You don’t know what the class names are
going to be in future versions. Fortunately, Microsoft tries to retain compatibility as much as possible
and has kept the same class names in Excel 2007 as prior versions. One of the more important changes
is the loss of the EXCELE window. That class was officially used for the Chart Window in previous ver-
sions, but was often hijacked as a convenient way of locating a cell’s on-screen position (by creating a
chart at that cell and reading the position of the EXCELE window).
Putting these items together, you can use the following code to find the location and size of the Excel
main window (in pixels):
‘UDT to hold window dimensions
Type RECT
Left As Long
608
Chapter 27: Programming with the Windows API
Rotate pages in pdf online - rotate PDF page permanently in C#.net, ASP.NET, MVC, Ajax, WinForms, WPF
Empower Users to Change the Rotation Angle of PDF File Page Using C#
rotate a pdf page; how to rotate all pages in pdf in preview
Rotate pages in pdf online - VB.NET PDF Page Rotate Library: rotate PDF page permanently in vb.net, ASP.NET, MVC, Ajax, WinForms, WPF
PDF Document Page Rotation in Visual Basic .NET Class Application
pdf page order reverse; how to rotate pdf pages and save permanently
Top As Long
Right As Long
Bottom As Long
End Type
‘API function to locate a window
Declare Function FindWindow Lib “user32” _
Alias “FindWindowA” ( _
ByVal lpClassName As String, _
ByVal lpWindowName As String) As Long
‘API function to retrieve a window’s dimensions
Declare Function GetWindowRect Lib “user32” ( _
ByVal hWnd As Long, _
lpRect As RECT) As Long
Sub ShowExcelWindowSize()
Dim hWnd As Long, uRect As RECT
‘Get the handle on Excel’s main window
‘Could also use hWnd = Application.Hwnd in Excel 2002+
hWnd = FindWindow(“XLMAIN”, Application.Caption)
‘Get the window’s dimensions into the RECT structure
GetWindowRect hWnd, uRect
‘Display the result
MsgBox “The Excel window has the following dimensions:” & _
vbCrLf & “ Left: “ & uRect.Left & _
vbCrLf & “ Right: “ & uRect.Right & _
vbCrLf & “ Top: “ & uRect.Top & _
vbCrLf & “ Bottom: “ & uRect.Bottom & _
vbCrLf & “ Width: “ & (uRect.Right - uRect.Left) & _
vbCrLf & “ Height: “ & (uRect.Bottom - uRect.Top)
End Sub
Resize the Excel window to cover a portion of the screen, and run the ShowExcelWindowSizeroutine. You
should be given a message box showing the window’s dimensions. Now try it with Excel maximized —
you may get negative values for the top and left. This is because the GetWindowRectfunction returns the
size of the Excel window, measuring around the edge of its borders. When maximized, the borders are off
the screen, but still part of the window.
What If Something Goes Wr ong?
One of the hardest parts of working with the Windows API functions is identifying the cause of any
errors. If an API call fails for any reason, it should return some indication of failure (usually a zero result
from the function) and register the error with Windows. You should then be able to use the VBAfunction
Err.LastDLLErrorto retrieve the error code, and use the FormatMessageAPI function to retrieve the
descriptive text for the error:
609
Chapter 27: Programming with the Windows API
VB.NET PDF Page Delete Library: remove PDF pages in vb.net, ASP.
Enable specified pages deleting from PDF in Visual Basic .NET class. Free trial SDK library download for Visual Studio .NET program. Online source codes for
permanently rotate pdf pages; how to reverse page order in pdf
VB.NET PDF Page Insert Library: insert pages into PDF file in vb.
add and insert one or multiple pages to existing adobe PDF document in VB.NET. Ability to create a blank PDF page with related by using following online VB.NET
rotate single page in pdf file; rotate pages in pdf and save
‘Windows API declaration to get the API error text
Private Declare Function FormatMessage Lib “kernel32” _
Alias “FormatMessageA” ( _
ByVal dwFlags As Long, _
ByVal lpSource As Long, _
ByVal dwMessageId As Long, _
ByVal dwLanguageId As Long, _
ByVal lpBuffer As String, _
ByVal nSize As Long, _
Arguments As Long) As Long
‘Constant for use in the FormatMessage API function
Private Const FORMAT_MESSAGE_FROM_SYSTEM As Long = &H1000
Sub ShowExcelWindowSize()
‘Define some variables to use in the API calls
Dim hWnd As Long, uRect As RECT
‘Get the handle on Excel’s main window
hWnd = FindWindow(“XLMAIN”, Application.Caption)
If hWnd = 0 Then
‘An error occurred, so get the text of the error
MsgBox LastDLLErrText(Err.LastDllError)
Else
‘Etc.
End If
End Sub
Function LastDLLErrText(ByVal lErrorCode As Long) As String
‘ *****************************************************
‘ *
‘ * Function Name:   LastDLLErrText
‘ *
‘ * Input:           lErrorCode - a Windows error number
‘ *
‘ * Output:          Returns the description corresponding to the error
‘ *
‘ * Purpose:         Retrieve a Windows error description
‘ *
‘ *****************************************************
Dim sBuff As String * 255, iAPIResult As Long
‘Get the text of the error and return it
iAPIResult = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, 0&, lErrorCode, _
0, sBuff, 255, 0)
LastDLLErrText = Left(sBuff, iAPIResult)
End Function
The full code for this example can be found in the module ‘m1_ExcelWindowSize’ in the API
Examples.xlsmworkbook, available at www.wrox.com.
610
Chapter 27: Programming with the Windows API
C# PDF Page Insert Library: insert pages into PDF file in C#.net
to merge PDF document files by C# code, how to rotate PDF document page to delete PDF page using C# .NET, how to reorganize PDF document pages and how
how to rotate pdf pages and save; how to rotate a single page in a pdf document
VB.NET PDF- View PDF Online with VB.NET HTML5 PDF Viewer
PDF pages extract, copy, paste, C#.NET rotate PDF pages, C#.NET read barcodes from PDF, C#.NET OCR scan PDF. C# ASP.NET Document Viewer, C# Online Dicom Viewer
pdf rotate pages and save; pdf rotate pages separately
Unfortunately, this technique does not always work. For example, if you change the class name to
XLMAINTESTin the FindWindowfunction call, you may expect to get an error message of Unable to
findwindow. In Windows XP, the error information is populated with the cryptic text The system
cannot find the file specified. In most cases, you do get more useful error information, as shown
in the next section.
Wr apping API Calls in Class Modules
If you need to use lots of API calls in your application, your code can get very messy, very quickly. Most
developers prefer to encapsulate the API calls within class modules, which provide a number of benefits:
The API declarations and calls are removed from your core application code.
The class module can perform a number of initialization and clean-up tasks, improving your
system’s robustness.
Many of the API functions take a large number of parameters, most of which are not used in
your situation. The class module needs to expose only those properties that need to be changed
by your calling routine.
Class modules can be stored as text, providing a self-contained set of functionality that is easy to
reuse in future projects.
The following code is an example of a class module for working with temporary files, allowing the call-
ing code to:
Create a temporary file in the Windows default TEMP directory
Create a temporary file in a user-specified directory
Retrieve the path and filename of the temporary file
Retrieve the text of any errors that may have occurred while creating the temporary file
Delete the temporary file after use
Create a class module called CTempFile and copy in the following code (this class can also be found in
the APIExamples.xlsm file at www.wrox.com):
‘***************************************************************************
‘*
‘* MODULE NAME:     EXCEL 2007 PROG REF - TEMP FILE CLASS
‘* AUTHOR:          STEPHEN BULLEN, Office Automation Ltd.
‘*
‘* CONTACT:         stephen@oaltd.co.uk
‘* WEB SITE:        http://www.oaltd.co.uk
‘*
‘* DESCRIPTION:     Encapsulates API calls for handling temporary files
‘*
‘***************************************************************************
Option Explicit
611
Chapter 27: Programming with the Windows API
C# PDF Page Delete Library: remove PDF pages in C#.net, ASP.NET
Free online C# class source code for deleting specified PDF pages in .NET console application. Able to remove a single page from PDF document.
rotate pages in pdf; rotate pdf page
VB.NET PDF - WPF PDF Viewer for VB.NET Program
PDF pages extract, copy, paste, C#.NET rotate PDF pages, C#.NET read barcodes from PDF, C#.NET OCR scan PDF. C# ASP.NET Document Viewer, C# Online Dicom Viewer
pdf rotate single page; pdf rotate page and save
‘Windows API declaration to find the Windows Temporary directory
Private Declare Function GetTempPath Lib “kernel32” _
Alias “GetTempPathA” ( _
ByVal nBufferLength As Long, _
ByVal lpBuffer As String) As Long
‘Windows API declaration to create, and return the name of,
‘a temporary filename
Private Declare Function GetTempFileName Lib “kernel32” _
Alias “GetTempFileNameA” ( _
ByVal lpszPath As String, _
ByVal lpPrefixString As String, _
ByVal wUnique As Long, _
ByVal lpTempFileName As String) As Long
‘Windows API declaration to get the text for an API error code
Private Declare Function FormatMessage Lib “kernel32” _
Alias “FormatMessageA” ( _
ByVal dwFlags As Long, _
ByVal lpSource As Long, _
ByVal dwMessageId As Long, _
ByVal dwLanguageId As Long, _
ByVal lpBuffer As String, _
ByVal nSize As Long, _
Arguments As Long) As Long
‘Constant for use in the FormatMessage API function
Const FORMAT_MESSAGE_FROM_SYSTEM As Long = &H1000
‘Variables to store the path, file and error message
Dim msTempPath As String
Dim msTempFile As String
Dim msErrMsg As String
Dim mbTidyUp As Boolean
One advantage of using a class module is that you can perform some operations when the class is initial-
ized. In this case, you will identify the default Windows TEMP directory. The temporary file will be created
in this directory, unless the calling code tells you otherwise:
‘Get the Windows temporary path when the class is initialized
Private Sub Class_Initialize()
‘Define some variables to use in the API calls
Dim sBuff As String * 255, lAPIResult As Long
‘Call the Windows API function to get the TEMP path
lAPIResult = GetTempPath(255, sBuff)
If lAPIResult = 0 Then
‘An error occurred, so get the text of the error
msErrMsg = LastDLLErrText(Err.LastDllError)
Else
‘Store the TEMP path
msTempPath = Left(sBuff, lAPIResult)
End If
End Sub
612
Chapter 27: Programming with the Windows API
VB.NET PDF - Create PDF Online with VB.NET HTML5 PDF Viewer
PDF pages extract, copy, paste, C#.NET rotate PDF pages, C#.NET read barcodes from PDF, C#.NET OCR scan PDF. C# ASP.NET Document Viewer, C# Online Dicom Viewer
rotate pdf pages in reader; rotate individual pages in pdf reader
C# HTML5 PDF Viewer SDK to create PDF document from other file
PDF pages extract, copy, paste, C#.NET rotate PDF pages, C#.NET read barcodes from PDF, C#.NET OCR scan PDF. C# ASP.NET Document Viewer, C# Online Dicom Viewer
save pdf rotate pages; pdf rotate all pages
This is the routine to create the temporary file, returning its name (including the path). In its simplest
use, the calling routine can just call this one method to create a temporary file:
‘Create a temporary file, returning its name (including the path)
Public Function CreateFile() As String
‘Define some variables to use in the API calls
Dim sBuff As String * 255, lAPIResult As Long
‘Try to get a temporary file name (also creates the file)
lAPIResult = GetTempFileName(msTempPath, “”, 0, sBuff)
If lAPIResult = 0 Then
‘An error occurred, so get the text of the error
msErrMsg = LastDLLErrText(Err.LastDllError)
Else
‘Created a temp file OK, so store the file and “OK” error message
msTempFile = Left(sBuff, InStr(1, sBuff, Chr(0)) - 1)
msErrMsg = “OK”
mbTidyUp = True
CreateFile = msTempFile
End If
End Function
In a class module, you can expose a number of properties that allow the calling routine to retrieve and
modify the temporary file creation. For example, you may want to enable the calling program to set
which directory to use for the temporary file. You could extend this to make the property read-only after
the file has been created, raising an error in that case. The use of Propertyprocedures in class modules
is described in more detail in Chapter 16:
‘Show the TEMP path as a property of the class
Public Property Get Path() As String
‘Return the path, without the final ‘\’
Path = Left(msTempPath, Len(msTempPath) - 1)
End Property
‘Allow the user to change the TEMP path
Public Property Let Path(sNewPath As String)
msTempPath = sNewPath
‘Ensure path ends with a \
If Right(msTempPath, 1) <> “\” Then 
msTempPath = msTempPath & “\”
End If
End Property
You can also give the calling routine read-only access to the temporary file’s name and full name (that is,
including the path):
‘Show the temporary file name as a property
Public Property Get Name() As String
Name = Mid(msTempFile, Len(msTempPath) + 1)
End Property
613
Chapter 27: Programming with the Windows API
‘Show the full name (directory and file) as a property
Public Property Get FullName() As String
FullName = msTempFile
End Property
Give the calling program read-only access to the error messages:
‘Show the error message as a property of the class
Public Property Get ErrorText() As String
ErrorText = msErrMsg
End Property
You’ll also allow the calling program to delete the temporary file after use:
‘Delete the temporary file
Public Sub Delete()
On Error Resume Next  ‘In case it has already been deleted
Kill msTempFile
mbTidyUp = False
End Sub
By default, you will delete the temporary file that you created when the class is destroyed. The calling
application may not want you to, so provide some properties to control this:
‘Whether or not to delete the temp file when the 
‘class is deleted
Public Property Get TidyUpFiles() As Boolean
TidyUpFiles = mbTidyUp
End Property
‘Allow the user to prevent the deletion of his/her own files
Public Property Let TidyUpFiles(bNew As Boolean)
mbTidyUp = bNew
End Property
In the class’s Terminate code, you’ll delete the temporary file, unless told not to. This code is run when
the instance of the class is destroyed. If declared within a procedure, this will be when the class variable
goes out of scope at the end of the procedure. If declared at a module level, it will occur when the work-
book is closed:
Private Sub Class_Terminate()
If mbTidyUp Then Delete
End Sub
The same function you saw in the previous section is used to retrieve the text associated with a Windows
API error code:
‘Get the text associated with a Windows API error code
Private Function LastDLLErrText(ByVal lErrorCode As Long) As String
Dim sBuff As String * 255, lAPIResult As Long
‘Get the text of the error and return it
614
Chapter 27: Programming with the Windows API
lAPIResult = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, _
0&, lErrorCode, 0, sBuff, 255, 0)
LastDLLErrText = Left(sBuff, lAPIResult)
End Function
Once this class module is included in a project, the calling routine does not need to know anything about
any of the API functions you’re using:
Sub TestCTempFile()
Dim oTempFile As New CTempFile
If oTempFile.CreateFile = “” Then
MsgBox “An error occurred while creating the temporary file:” & _
vbCrLf & oTempFile.ErrorText
Else
MsgBox “Temporary file “ & oTempFile.FullName & “ created”
End If
End Sub
This results in a message like this:
Temporary file C:\WINDOWS\TEMP\5024.TMP created
Note that the temporary file is created during the call to CreateFile. When the procedure ends, the
variable oTempFilegoes out of scope and hence is destroyed by VBA. The Terminate event in the class
module ensures the temporary file is deleted—the calling procedure does not need to know about any
clean-up routines. If CreateFile is called twice, only the last temporary file is deleted. A new instance
of the class should be created for each temporary file required.
You can force an error by amending TestCTempFile to specify a nonexistent directory for the tempo-
rary file:
Sub TestCTempFile()
Dim oTempFile As New CTempFile
‘Tell the class to use a non-existent path
oTempFile.Path = “C:\NoSuchPath”
If oTempFile.CreateFile = “” Then
MsgBox “An error occurred while creating the temporary file:” & _
Chr(10) & oTempFile.ErrorText
Else
MsgBox “Temporary file “ & oTempFile.FullName & “ created”
End If
End Sub
This time, you get a meaningful error message (see Figure 27-1).
615
Chapter 27: Programming with the Windows API
Figure 27-1
Som e Example Classes
This section provides a number of common API calls to include in your projects. Note that in each case,
the function and constant definitions must be put in the Declarationssection at the top of a module.
A High-Resolution Timer Class
When testing your code, it is a good idea to time the various routines to identify and eliminate any bot-
tlenecks. VBA includes two functions that can be used as timers:
The Now function returns the current time and has a resolution of about one second.
The Timer function returns the number of milliseconds since midnight, with a resolution of
approximately 10 milliseconds.
Neither of these are accurate enough to time VBA routines, unless the routine is repeated many times.
Modern PCs include a high-resolution timer, which updates many thousands of times per second,
accessible through API calls. You can wrap these calls in a class module to provide easy access to a high-
resolution timer.
Class Module CHighResTimer
Note that the API Viewer shows these definitions using the LARGE_INTEGER data type, but they are
defined as Currency:
Option Explicit
‘How many times per second is the counter updated?
Private Declare Function QueryFrequency Lib “kernel32” _
Alias “QueryPerformanceFrequency” ( _
lpFrequency As Currency) As Long
‘What is the counter’s value
Private Declare Function QueryCounter Lib “kernel32” _
Alias “QueryPerformanceCounter” ( _
lpPerformanceCount As Currency) As Long
616
Chapter 27: Programming with the Windows API
The LARGE_INTEGER is a 64-bit data type, usually made up of two Longtypes. The VBACurrencydata
type also uses 64 bits to store the number, so you can use it in place of a LARGE_INTEGER. The only dif-
ferences are that the Currency data type is scaled down by a factor of 10,000, and that VBA can perform
standard math operations with Currencyvariables:
‘Variables to store the counter information
Dim mcyFrequency As Currency
Dim mcyOverhead As Currency
Dim mcyStarted As Currency
Dim mcyStopped As Currency
The API call itself takes a small amount of time to complete. For accurate timings, you should take this
delay into account. You find this delay and the counter’s frequency in the class’s Initialize routine:
‘When first initialized, determine the overhead incurred when retrieving the
‘high-performance counter value
Private Sub Class_Initialize()
Dim cyCount1 As Currency, cyCount2 As Currency
‘Get the counter frequency
QueryFrequency mcyFrequency
‘Call the hi-res counter twice, to check how long it takes
QueryCounter cyCount1
QueryCounter cyCount2
‘Store the call overhead
mcyOverhead = cyCount2 - cyCount1
End Sub
Public Sub StartTimer()
‘Get the time that you started
QueryCounter mcyStarted
End Sub
Public Sub StopTimer()
‘Get the time that you stopped
QueryCounter mcyStopped
End Sub
Public Property Get Elapsed() As Double
Dim cyTimer As Currency
‘Have you stopped or not?
If mcyStopped = 0 Then
QueryCounter cyTimer
Else
cyTimer = mcyStopped
End If
‘If you have a frequency, return the duration, in seconds
If mcyFrequency > 0 Then
Elapsed = (cyTimer - mcyStarted - mcyOverhead) / mcyFrequency
End If
End Property
617
Chapter 27: Programming with the Windows API
Documents you may be interested
Documents you may be interested