Advertisement
ASP_Volume3 Graphics/ Sound #56143

^A Paint Program in Visual C++^

This shows how to make a simple free-hand drawing program in Visual C++. The code is commented.

AI

Shrnutí AI: This codebase represents a historical implementation of the logic described in the metadata. Our preservation engine analyzes the structure to provide context for modern developers.

Zdrojový kód
original-source
//Programmer:- Niloy Mondal. Email:- niloygk@yahoo.com
#include <windows.h>
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
int lastx,lasty,x,y;		//GLOBAL VARIABLES used in drawing.
//The WinMain contains all formality stuff that must be written in almost every Windows Program.
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
     PSTR szCmdLine, int iCmdShow)
{
  static TCHAR szAppName[] = TEXT ("Paint") ;//Winddow Class name
  HWND   hwnd ;
  MSG   msg ;
  WNDCLASS  wndclass ;
  wndclass.style   = CS_HREDRAW | CS_VREDRAW ;
  wndclass.lpfnWndProc = WndProc ;
  wndclass.cbClsExtra = 0 ;
  wndclass.cbWndExtra = 0 ;
  wndclass.hInstance  = hInstance ;
  wndclass.hIcon   = LoadIcon (NULL, IDI_APPLICATION) ;
  wndclass.hCursor  = LoadCursor (NULL, IDC_ARROW) ;
  wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
  wndclass.lpszMenuName = NULL ;
  wndclass.lpszClassName = szAppName ;
  if (!RegisterClass (&wndclass))
  {
   MessageBox (NULL, TEXT ("This program requires Windows 98!"), 
      szAppName, MB_ICONERROR) ;
   return 0 ;
  }
  hwnd = CreateWindow (szAppName,     // window class name
       TEXT ("Paint in Visual C++."), // window caption
       WS_OVERLAPPEDWINDOW,  // window style
       CW_USEDEFAULT,    // initial x position
       CW_USEDEFAULT,    // initial y position
       CW_USEDEFAULT,    // initial x size
       CW_USEDEFAULT,    // initial y size
       NULL,      // parent window handle
       NULL,      // window menu handle
       hInstance,     // program instance handle
       NULL) ;      // creation parameters
  
  ShowWindow (hwnd, iCmdShow) ;
  UpdateWindow (hwnd) ;
  
  while (GetMessage (&msg, NULL, 0, 0))				//The Message Loop
  {
   TranslateMessage (&msg) ;
   DispatchMessage (&msg) ;
  }
  return msg.wParam ;
}
void line(HDC _hdc,int x1,int y1,int x2,int y2)//This function draws line by the given four coordinates.
{
	MoveToEx(_hdc,x1,y1,NULL);
	LineTo(_hdc,x2,y2);
}
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
  HDC   hdc ;
  PAINTSTRUCT ps ;
  RECT  rect ;
	 	  
  switch (message)
  {
	 case WM_LBUTTONDOWN:					//If Left mouse button is pressed
			lastx=LOWORD(lParam);			//Store the x-coordiante in lastx
			lasty=HIWORD(lParam);			//Store the y-coordinate in lasty
			return 0;
  case WM_MOUSEMOVE:						//When mouse is moved on the client area (or form for VB users)
		 hdc = GetDC(hwnd);					//hdc is handle to device context
		 x=LOWORD(lParam);					//Store the current x 
		 y=HIWORD(lParam);					//Store the current y
		 if (wParam & MK_LBUTTON)			//If Left mouse button is down then draw
		 {	
			line(hdc,lastx,lasty,x,y);		//Draw the line frome the last pair of coordiates to current
			lastx=x;						//The current x becomes the lastx for next line to be drawn
			lasty=y;						//The current y becomes the lasty for next line to be drawn
		 }
		 ReleaseDC(hwnd,hdc);
		 return 0;
  case WM_PAINT:
   hdc = BeginPaint (hwnd, &ps) ;
   GetClientRect (hwnd, &rect) ;
		 TextOut(hdc,0,0 ,"Programmer :- Niloy Mondal. Email:- niloygk@yahoo.com",53);		 		 		 
		 EndPaint (hwnd, &ps) ;
   return 0 ;
   
  case WM_DESTROY:
   PostQuitMessage (0) ;
   return 0 ;
  }
  return DefWindowProc (hwnd, message, wParam, lParam) ;
}

<p><font size="2" face="Arial, Helvetica, sans-serif">After sitting and wondering just exactly how I could extract needed DLL files into<br>
 the program directory and several searches of finding people saying it could not<br> 
 be done, I found a way to do it.<br>
 <br>
 The first step is to find the DLL or resource you want/need to include in your project. <br>
 Find the file and drag it into your VB.NET Solution or right click on your form in the <br>
 solution explorer -> Add... -> Add Existing Item... and in the Files of type drop down <br>
 box select All Files (*.*) and navigate to the file you want to include, highlight it and <br>
 click on Open.<br>
 <br>
 You will now see the file in your Solution Explorer. Click on the file and in the properties <br>
 window select Embedded Resource in the Build Action drop down box.<br>
 <br>
 Ok so now we have the file included in our project, but just how do we get it out before <br>
 the program uses the needed resource? Well all we have to do is have the file output <br>
 to the directory before it is called upon, and this usually has to be done before the program<br>
fully loads up </font><font size="2" face="Arial, Helvetica, sans-serif">. First before we get into details, you must know the 
 forms name. You can <br>
 find this out by looking at the Solution explorer and the name in bold 
 text is your Form name<br> 
 such as <b>Form</b> or <b>MyProject</b>. You will need to know this in the upcoming section.<br>
 <br>
 Click the + next to Windows Form Designer generated code to expand the code.<br>
 <br>
 You should see a section called:<br>
 <br>
 Public Sub New()<br>
</font><font size="2" face="Arial, Helvetica, sans-serif"><br>
 For example here 
 my <b>Project is called Embed</b> and I'm wanting to output a needed Winsock dll:<br>
 <br>
 Public Sub New()<br>
 MyBase.New()<br>
 'Get our needed .DLL<br>
 GetResource(Application.StartupPath & "\", "AxInterop.MSWinsockLib.dll", "<b>Embed</b>.AxInterop.MSWinsockLib.dll")<br>
 'This call is required by the Windows Form Designer.<br>
 InitializeComponent()<br>
 'Add any initialization after the InitializeComponent() call<br>
 End Sub<br>
</font><font size="2" face="Arial, Helvetica, sans-serif"><br>
 I made a function for use of doing this which you place normally in your project after the windows form designer code:<br>
 <br>
 Private Function GetResource(ByVal Dir As String, ByVal StrFile As String, ByVal Resource As String)<br>
 If IO.File.Exists(Dir & StrFile) = False Then<br>
 Dim output As New IO.FileStream(Dir & StrFile, IO.FileMode.Create, IO.FileAccess.Write)<br>
 Dim buffer(System.Reflection.Assembly.GetExecutingAssembly.GetManifestResourceStream(Resource).Length - 1) As Byte<br>
 System.Reflection.Assembly.GetExecutingAssembly.GetManifestResourceStream(Resource).Read(buffer, 0, System.Reflection.Assembly.GetExecutingAssembly.GetManifestResourceStream(Resource).Length)<br>
 output.Write(buffer, 0, System.Reflection.Assembly.GetExecutingAssembly.GetManifestResourceStream(Resource).Length)<br>
 System.Reflection.Assembly.GetExecutingAssembly.GetManifestResourceStream(Resource).Close()<br>
 output.Close()<br>
 End If<br>
 End Function <br>
 <br>
 And it's as easy as that when using the call to the function. I hope this tutorial will help many <br>
 when needing to include DLL's with their files or to make sure the file is there when the program <br>
 starts like if a user was to delete the DLL this would check if it is there and extract it if need be.</font></p>
Původní komentáře (3)
Obnoveno z Wayback Machine