学习Win32 API已经有一段时间了,通过自己的摸索慢慢的知道了一些Windows编程的入门级的技巧,前些天在优酷上
看了一段windows程序设计的视频教程,里面的老师说过一句话,大体意思是要编写具有一定规模的代码才能提高自己的编程
实践水平。
想来想去,发现如果编写一个自己的可以着色的代码编辑器倒是一件不错的事情。因此打算在后来的一段时间里自己开发一
个小型的代码编辑器。目前的打算是仅支持C语法的着色。
因为我有的只是PLC项目的编程经验(与Windows编程虽然说大道至同,但是还是不一样的),因此最初也没有具体
的设计,只是想到什么就弄什么,如果能成功,以后就整理出一份文档。
从昨天晚上到现在,已经可以实现文件的存储了,但是功能还有待提高。
Exp:
下面是运行的界面。
下面是部分代码:
Exp:
#
#include <windows.h>
#
#include "resource.h"
#
#include <stdlib.h>
#
#define IDE_EDIT 100
LRESULT CALLBACK WindowProc(HWND,UINT,WPARAM,LPARAM);
BOOL SaveFile(HWND hwnd);
static TCHAR CmdLineFile[256];
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int iShowCmd)
{
HWND hwnd;
MSG msg;
WNDCLASS wndclass;
TCHAR ClsName[]=L"voledit";
TCHAR WinCaption[]=L"volEdit";
wndclass.cbClsExtra=0;
wndclass.cbWndExtra=0;
wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);
wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
wndclass.hInstance=hInstance;
wndclass.lpfnWndProc=WindowProc;
wndclass.lpszClassName=ClsName;
wndclass.lpszMenuName=NULL;
wndclass.style=CS_HREDRAW | CS_VREDRAW;
if(!RegisterClass(&wndclass))
return 1;
hwnd=CreateWindow(ClsName,
WinCaption,
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
LoadMenu(hInstance,MAKEINTRESOURCE(IDR_MENU1)),
hInstance,
NULL
);
ShowWindow(hwnd,iShowCmd);
UpdateWindow(hwnd);
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
LRESULT CALLBACK WindowProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
static HWND hEdit;
int cxClient,
cyClient;
switch(message)
{
case WM_SIZE:
cxClient=HIWORD(lParam);
cyClient=LOWORD(lParam);
MoveWindow(hEdit,0,0,cyClient,cxClient,TRUE);
return 0;
case WM_COMMAND:
switch(LOWORD(wParam))
{
case ID_FILE_QUIT:
PostQuitMessage(0);
break;
case ID_FILE_SAVE40003:
SaveFile(hwnd);
break;
}
case WM_CREATE:
hEdit=CreateWindow(TEXT("edit"),
NULL,
WS_CHILD | WS_VISIBLE |WS_VSCROLL |ES_LEFT |ES_MULTILINE |ES_AUTOVSCROLL,
0,
0,
0,
0,
hwnd,
(HMENU)IDE_EDIT,
(HINSTANCE)GetWindowLong(hwnd,GWL_HINSTANCE),
NULL
);
return 0;
case WM_CLOSE:
DestroyWindow(hwnd);
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd,message,wParam,lParam);
}
BOOL SaveFile(HWND hwnd)
{
HANDLE hFile;
DWORD dwWrite;
HWND hEdit;
TCHAR *buffer;
unsigned long int iTextLen;
hEdit=GetDlgItem(hwnd,IDE_EDIT);
iTextLen=SendMessage(hEdit,WM_GETTEXTLENGTH,0,0) +1 ;
buffer=(TCHAR *)malloc(iTextLen *sizeof(TCHAR));
SendMessage(hEdit,WM_GETTEXT,iTextLen,(LPARAM)buffer);
hFile=CreateFile(L"test.txt",
GENERIC_READ |GENERIC_WRITE,
FILE_SHARE_READ,
NULL,
OPEN_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
NULL
);
SetFilePointer(hFile,0,0,FILE_BEGIN);
WriteFile(hFile,buffer,iTextLen,&dwWrite,NULL);
CloseHandle(hFile);
return TRUE;
}
代码不是很精简,而且有的地方没有对有效性进行检查。以后慢慢弄吧。
资源文件代码:
// Microsoft Visual C++ generated resource script.
//
#include "resource.h"
#define APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 2 resource.
//
#include "afxres.h"
/////////////////////////////////////////////////////////////////////////////
#undef APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
// Chinese (P.R.C.) resources
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS)
#ifdef _WIN32
LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED
#pragma code_page(936)
#endif //_WIN32
#ifdef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// TEXTINCLUDE
//
1 TEXTINCLUDE
BEGIN
"resource.h\0"
END
2 TEXTINCLUDE
BEGIN
"#include ""afxres.h""\r\n"
"\0"
END
3 TEXTINCLUDE
BEGIN
"\r\n"
"\0"
END
#endif // APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Menu
//
IDR_MENU1 MENU
BEGIN
POPUP "File(&F)"
BEGIN
MENUITEM "Open(&O)", ID_FILE_OPEN40001
MENUITEM "Close(&C)", ID_FILE_CLOSE40002
MENUITEM SEPARATOR
MENUITEM "Save(&S)", ID_FILE_SAVE40003
MENUITEM "Save as...", ID_FILE_SAVEAS
MENUITEM SEPARATOR
MENUITEM "Quit(&Q)", ID_FILE_QUIT
END
POPUP "Edit(&E)"
BEGIN
MENUITEM "Copy(&C)", ID_EDIT_COPY40006
MENUITEM "Cut(&X)", ID_EDIT_CUT40007
MENUITEM "Paste(&P)", ID_EDIT_PASETE
MENUITEM SEPARATOR
MENUITEM "Find(&G)", ID_EDIT_FIND40009
END
END
#endif // Chinese (P.R.C.) resources
/////////////////////////////////////////////////////////////////////////////
#ifndef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 3 resource.
//
/////////////////////////////////////////////////////////////////////////////
#endif // not APSTUDIO_INVOKED
目前的东西大体就真么多,希望可以完成这项工作。