这一段时间 调用库文件 一直捆饶着我 好几个问题都卡在这里
很无语~ 我家的小老婆 最近耍脾气了?
现在终于又能播放声音了,虽然还是比较简单的创建和调用,但是程序里面多了优美的旋律还是让人陶醉
关于创建音频的几个小细节 音频句柄设置为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) ;
绘制代码;//上面这段就有点偷懒了