My Windows Program Design in 2007

翻了下自己从前的日志。
发现自己大二的时候写的一个WIN32程序,就随便贴出来,也见证下自己的学习历程


天闛/xy忏 n 发表于2007年04月11日 12:05 阅读(7) 评论(2)
分类: 个人日记 权限: 公开


实现EDIT控件 和BUTTON控件 联合用

部分代码:

//Global variables
LPTSTR lpBuffer;
//stack variables
CJ_hwndButton=CreateWindow("BUTTON","请输入文字,点我保存",WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,500,250,150,30,hwnd,(HMENU)IDV_BBUTTON,hInst,NULL); //WS_CHILD声明子窗口

CJ_hwndEdit=CreateWindow(TEXT("EDIT"),NULL,WS_CHILD|WS_VISIBLE|WS_VSCROLL|ES_LEFT|ES_MULTILINE|ES_AUTOVSCROLL,500,150,100,100,hwnd,(HMENU)IDV_BEDIT,hInst,NULL);

...

case WM_COMMAND:
{
switch(HIWORD(wParam))
{
case BN_CLICKED:
{
switch(LOWORD(lParam))
{
case IDV_BBUTTON:
{
lpBuffer=(LPTSTR)malloc((GetWindowTextLength(CJ_hwndEdit)+1)*sizeof(TCHAR));
GetDlgItemText(hwnd,IDV_BEDIT,lpBuffer,1000);

TCHAR szBuf[128];
DWORD dwRead;
DWORD dwWritten;

hTextFile=CreateFile("new.txt",GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);//创建文件句柄
WriteFile(hTextFile,lpBuffer,strlen(lpBuffer),&dwWritten,NULL);//写入文件
SetFilePointer(hTextFile,0,NULL,FILE_BEGIN);//设置文件指针 指向文件头 在写入文件数据时hTextFile指针指向了文件尾,所以现在还原
if(ReadFile(hTextFile,szBuf,strlen(lpBuffer),&dwRead,NULL))
{
MessageBox(hwnd,szBuf,"Read File",MB_OK);
}
CloseHandle(hTextFile);//解决两进程同时使用同一个文件冲突问题

SetDlgItemText(hwnd,IDV_BEDIT,NULL);

...
}
//还能进一步优化的是 要使IDV_BBUTTON控件在不输入的时候失效
//开始想着是用WM_TIMER消息检测lpBuffer变量是否为空,但是不行.主要原因有两点:1 消耗太大的CPU资源 2,时钟必定是时钟消息,不能马上响应


//使用一个BOOL标记让执行绪正常终止。KillThread函式只有在正常终止执行绪比较困难时才应该使用,原因是执行绪可以配置资源,如果当执行绪终止时没有释放所配置的记忆体,那么记忆体将仍然是被配置了的。它不同于程序能自动释放资源


哈哈 EnableWindow(hwnd,bool)问题解决了

原来 我定义的hwnd在消息处理函数中 , 消息循环每次都会重新创建和更新 ,本来就在一个循环里,肯定会更新的嘛.......

所以在消息处理里面处理EnableWindow()是没有用的 只有把HWND定义为消息外的全局变量 才处理 才能实现.问题继续探索中,在一开始消息循环中,怎么响应文本框的光标消息呢? 着才是解决问题的关键~~

这几天闷闷的,心情好混乱,怎么老是怪怪地~


这一段时间 调用库文件 一直捆饶着我 好几个问题都卡在这里

很无语~ 我家的小老婆 最近耍脾气了?

现在终于又能播放声音了,虽然还是比较简单的创建和调用,但是程序里面多了优美的旋律还是让人陶醉


关于创建音频的几个小细节 音频句柄设置为GLOBAL 可以让音乐在整个程序过程中运行 而不受父消息的影响, 这个问题我提前想到了,所以很顺利.
在子窗口中不要加载WM_CLOSE消息
记得在主消息中 删除音频句柄 学C++的时候就要养成一个好的习惯就是 NEW 对应着 一个DELETE 还好,自从看过林锐写的书后 我对此还是很敏感的~


由加载EXE文件想到的: 方法是把EXE转换为二进制 然后写入文件 最后再转换为EXE文件 于是就想能不能加载其他文件格式的
果然不出所料,同样的想法 , 加载WMA 文件成功了 转为WMA文件后 再MCIWndPlay ()播放文件 这个相当与把WMA和执行文件捆绑在一起了 缺点就是程序必须占用很多资源 这肯定是不提倡的


自己实现的简单ANSI文字输入框和一些细节, 早点写完,睡觉去了...

首先必须注意的是几个变量,虽然开始我没在意,但理解却就在这个几个变量中.
int cxChar,cyChar,cxClient,cyClient,cxBuffer,cyBuffer

cxChar 字符的宽
cyChar 字符的高
cxClient 屏幕的宽
cyClient 屏幕的高
cxBuffer 一行能储存多少个字符个数
cyBuffer 一列能储存多少个字符个数
能很好的理解上面四个变量 对于写一个输入文本框就很容易了.

首先当然是初始化了.
SelectObject ( hdc, CreateFont (0, 0, 0, 0, 0, 0, 0, 0,
CJ_CharSet, 0, 0, 0, FIXED_PITCH, NULL)) ;

GetTextMetrics (hdc, &tm) ;
cxChar = tm.tmAveCharWidth ;
cyChar = tm.tmHeight ;

取得字体.. 这个用户也可以指定字体
然后是屏幕大小 和 BUFFER
cxClient = LOWORD (lParam) ;
cyClient = HIWORD (lParam) ;

cxBuffer=max(1,cxClient/cxChar)//屏幕长度除字符宽度 就可以获得字符个数了,这个就相当于 求变量的个数了.
cyBuffer=max(1,cyClient/cyChar)//这里用max的道理是 防止cyBuffer为0;

然后是 空间的填充
pBuffer = (TCHAR *) malloc (cxBuffer* cyBuffer * sizeof (TCHAR)) ;

for (y = 0 ; y < cyBuffer ; y++)
for (x = 0 ; x < cxBuffer ; x++)
BUFFER(x,y) = '_' ;
建立光标 ..这里就省略了
case VK_LEFT:
xCaret = max (xCaret - 1, 0) ;
break ;
case VK_RIGHT:
xCaret = min (xCaret + 1, cxBuffer - 1) ;
上面是左右键的处理 光标位置-1 与 0比较 来确定光标位置
for (x = cxBuffer ; x >=xCaret ; x--)
BUFFER (x+1, yCaret)=BUFFER (x , yCaret) ;
学过数组的人 对上面应该很熟悉了,数组的移位 上面是空格键
for (x = xCaret ; x < cxBuffer - 1 ; x++)
BUFFER (x, yCaret) = BUFFER (x + 1, yCaret) ;
DEL键

case WM_PAINT:
hdc = BeginPaint (hwnd, &ps) ;
SelectObject (hdc, CreateFont (0, 0, 0, 0, 0, 0, 0, 0,
CJ_CharSet, 0, 0, 0, FIXED_PITCH, NULL)) ;

for (y = 0 ; y < cyBuffer ; y++)
TextOut (hdc, 0, y * cyChar, & BUFFER(0,y), cxBuffer) ;
DeleteObject (SelectObject (hdc, GetStockObject (SYSTEM_FONT))) ;
EndPaint (hwnd, &ps) ;

绘制代码;//上面这段就有点偷懒了
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值