随笔:53 文章:0 评论:86 引用:0
首页 发新随笔
发新文章 联系 聚合管理

2013年5月27日

     摘要:   阅读全文
posted @ 2013-05-27 21:27 foxtail 阅读(362) | 评论 (0)编辑 收藏

2009年6月2日

1、编辑MySQL(和PHP搭配之最佳组合)配置文件:

windows环境中:%MySQL(和PHP搭配之最佳组合)_installdir%\my.ini //一般在MySQL(和PHP搭配之最佳组合)安装目录下有my.ini即MySQL(和PHP搭配之最佳组合)的配置文件。
linux环境中:/etc/my.cnf

在[MySQL(和PHP搭配之最佳组合)d]配置段添加如下一行:
skip-grant-tables

保存退出编辑。

2、然后重启MySQL(和PHP搭配之最佳组合)服务

windows环境中:
net stop MySQL(和PHP搭配之最佳组合)
net start MySQL(和PHP搭配之最佳组合)

linux环境中:
/etc/init.d/MySQL(和PHP搭配之最佳组合)d restart

3、设置新的ROOT密码

然后再在命令行下执行:
MySQL(和PHP搭配之最佳组合) -uroot -p MySQL(和PHP搭配之最佳组合)
直接回车无需密码即可进入数据库了。

现在我们执行如下语句把root密码更新为 7758521:
update user set password=PASSWORD("7758521") where user='root';

quit 退出MySQL(和PHP搭配之最佳组合)。

4、还原配置文件并重启服务

然后修改MySQL(和PHP搭配之最佳组合)配置文件把刚才添加的那一行删除。

再次重起MySQL(和PHP搭配之最佳组合)服务,密码修改完毕。

修改完毕。

用新密码7758521试一下吧,又能登入MySQL(和PHP搭配之最佳组合)的感觉就是不一样吧?

posted @ 2009-06-02 16:58 foxtail 阅读(432) | 评论 (0)编辑 收藏

2009年1月20日

关于文本的输出

在如何自己编写文本控件时,有关于如何展开Tab的具体做法:

 1void TextView::PaintLine(HDC hdc,int line_no)
 2
 3{
 4
 5       int length = document->GetLineLength(line_no + start_line_no);
 6
 7       char *buffer = new char[length];
 8
 9       document->GetLineBuffer(buffer,line_no + start_line_no);
10
11       //容纳单行文本矩形区域
12
13       RECT line_rect;
14
15       GetClientRect(tv_hwnd,&line_rect);
16
17       line_rect.top = line_no*(font_height + font_extra);
18
19       line_rect.bottom = line_rect.top + font_height + font_extra;
20
21       line_rect.left -= start_column_no*5;
22
23       //展开Tab字符
24
25       int tab = 4*font_width;
26
27       int width = TabbedTextOut(hdc,line_rect.left,line_rect.top,buffer,length,1,&tab,line_rect.left);//输出文字
28
29       line_rect.left = LOWORD(width);
30
31       ExtTextOut(hdc,0,0,ETO_OPAQUE,&line_rect,0,0,0);
32
33       delete []buffer;
34
35}

36


要明白他的意思才能在以后的编写扩展功能才能得心应手。首先要明白一个函数。

 

TabbedTextOut

功能:

1将一个字符串写到指定位置。

2并按制表位位置数组里的值展开制表符

 

函数原型:

LONG TabbedTextOut(HDC hdc, int X, int Y, LPCTSTR lpString, int nCount, int nTabPositions, LPINT lpn TabStopPositions, int nTabOrigin)

 

参数意义:

Hdc :设备环境句柄。

X   字符串开始点的x坐标(逻辑单位)。

Y   字符串开始点的y坐标(逻辑单位)。

lpString:缓冲区指针。

nCount 字符数。

nTabPositions:指定制表位位置数组的值的个数。

lpnTabStopPositions:数组,包含制表位位置(逻辑单位)。必须按照升序保存。

nTabOrigin:指定制表符展开的开始位置的x坐标(逻辑单位)。

 

返回值:字符串的尺寸,高位字表示高度,低位表示宽度。

 

注:

【1】       如果nTabPositions值为0,且lpnTabStopPositions值位NULL,那么制表符会按平均字符宽度的8位来扩展

【2】       如果lpnTabStopPositions数组包含一个以上的话,则制表位被设为数组里的每一个值,共为lpnTabStopPositions个。

【3】       nTabOrigin参数允许一个应用程序为一行多次调用TabbedTextOut。如果应用程序多次调用TabbedTextOutnTabOrigin每次都设置相同的值,则此函数在相对于nTabOrigin指定的位置处展开所有的制表符。

 

知识补充:

TabbedTextOut(hdc,line_rect.left,line_rect.top,buffer,length,1,&tab,line_rect.left);

第六个参数为nTabPosition = 1

第七个参数为lpnTabStopPositions = tab = 4*font_width

第八个参数位nTabOrigin = line_rect.left

因为编辑器以行位模型,当然是从一行的最左端开始。制表位数组值一个等于字体宽度的4倍。

 

摘自《windows编程》的解释

TabbedTextOut的前五个参数与TextOut相同,第六个参数是跳位间隔数,第七个是以图素为单位的跳位间隔数组。

 

1  如果平均字符宽度是8个图素,而您希望每5个字符加一个跳位间隔,则这个数组将包含4080120,按递增顺序依此类推。

【2】       如果第六个和第七个参数是0NULL,则跳位间隔按每八个平均字符宽度设定。

【3】       如果第六个参数是1,则第七个参数指向一个整数,表示跳位间隔重复增大的倍数(例如,如果第六个参数是1,并且第七个参数指向值为30的变量,则跳位间隔设定在306090…图素处)。最后一个参数给出了从跳位间隔开始测量的逻辑x坐标,它与字符串的起始位置可能相同也可能不同。

 

编辑器的展开tab属于【3】,增大倍数是4个字符宽度。4倍与8倍的区别如图:

 

 

posted @ 2009-01-20 17:14 foxtail 阅读(1676) | 评论 (4)编辑 收藏

2008年11月16日

  继续上个版本修改了一些bug,然后美化了一下。

发现自己的审美观不咋的,俺觉得漂亮的人家觉得不漂亮。还是照着大家要求的画一个。

主要解决的问题是,这次行列都用宏表示,这样可以修改行列,窗口大小也动态改变。

另外长条旋转变成Z型问题也解决,主要是取模的时候绕回去了。

其中最重要的要算是解决了刷新闪烁问题,尽管HAM2008指点过,始终没做成,这次vczh说了一句话就点醒了我。根本不应该使用InvalidateRect函数,直接画,然后用缓冲DC就可以了。

VOID OnPaint()
{
    HDC hdc 
= GetDC(hWnd);
    HDC bitmap_dc 
= CreateCompatibleDC(hdc);
    HBITMAP bitmap 
= CreateCompatibleBitmap(hdc,1024,768);
    SelectObject(bitmap_dc,bitmap);
    
   
/********************************************
   DrawBlock
   ********************************************
*/

   
int x = tetris.GetX();
   
int y = tetris.GetY();

   
for(int i=0; i<4++i)
   
{
       
for(int j=0; j<4++j)
       
{
           
if(current_block[i][j] == 1)
           
{
               DrawBlock(bitmap_dc,y
+i+1,x+j+1,3,3,tetris.GetColor(),RGB(0,0,0));
           }

       }

   }


   
/*****************************************
   *DrawContainer
   *****************************************
*/

   
for(int i=0; i<ROWS; ++i)
   
{
       
for(int j=0; j<COLS; ++j)
       
{
           
if(Container[i][j] == 1)
           
{
               DrawBlock(bitmap_dc,i
+1,j+1,3,3,ColorTable[i][j],RGB(0,0,0));
           }

       }

   }


   BitBlt(hdc,
0,0,1024,768,bitmap_dc,0,0,SRCCOPY);
   DeleteDC(bitmap_dc);
   DeleteObject(bitmap);
   ReleaseDC(hWnd,hdc);
}

以上就是GDI缓冲的主要实现代码。


可执行文件下载
代码还是等全部完善后上传吧。Redist请自行下载。
代码估计要有大的改动,感觉现在的代码没一点C++的味道。
有点简单,用陈坤的话说就是扩展性不好。
posted @ 2008-11-16 00:22 foxtail 阅读(1311) | 评论 (2)编辑 收藏

2008年11月9日

 

记得8月份写过俄罗斯方块,那会全是用坐标表示的。包括所有方块的变换,甚至方块的表示。导致程序内部许多的case语句,甚为麻烦。代码量也有近1800行左右。而且写完后bug很多,修正也修正不完,异常头痛便放弃了。

现在看看《编程之美》的俄罗斯方块的思路,又想起vczh用脚本的写的俄罗斯方块,就又起了兴趣。便重新设计完成了,这次基本没什么bug了。只不过操作习惯上和QQ的俄罗斯方块还有些不同。

1.       在底部的时候,如果按住旋转不放,则会停留原地旋转。原因是为了检测接触底部时旋转不插入墙壁,就同接触左右墙壁一样,做了调整方块坐标处理。处理方法是根据旋转后方块的坐标加上(减去)最大列(最小列)在减去(左)右边界得到。底部也是这样计算的。当然有了这样的检测便出现了这样的小小的bug,不过我相信没人会在底部按住不放的。

2.       这次方块全部存储在一个一维数组中,通过指针的变换来改变方块种类与旋转状态,但是为了方便操作,就拷贝到了一个二维数组中。起初设计是一个四维数组,这样就方便多了,但是VS2008的编译器却不能编译通过,int[4][4]int **p的转换不成功,朋友说是编译器问题。后来经Lend3d说,很多项目都是不用大于二维的数组的,于是干脆就用了一维数组,本来要听从他意见用结构表示一个低二位的数组元素,但是初始化和使用都不是很方便。

3.       另外关于GDI缓冲,试用了一下,但是作用貌似不大,不知道原因。关于这方面的知识援助还是要感谢HAM2008的帮助。



贴个头文件出来就可以知道大致做法了。
#ifndef TETRIS_H
#define TETRIS_H

#pragma once

extern int Container[18][10];//容纳方块的空间
extern int current_block[4][4];

/****************************
* 方块的主要行为
****************************
*/

class Tetris
{
public:
    Tetris();
    
~Tetris();
    
void GenerateBlock();
    
void StepLeft();
    
void StepRight();
    
void StepDown();
    
void Rotate();
    
void CaculateScore();
    
void IsOver();
public:
    
bool lost;
    
int score;//得分
    int GetX();
    
int GetY();
private:
    inline 
int CaculateMinCol();
    inline 
int CaculateMinRow();
    inline 
int CaculateMaxCol();
    inline 
int CaculateMaxRow();

    
void CaculateBlockBoundary();
    
bool DetectCollision();
    
void CopyToContainer();
    
void CopyToBlock();

    
int *block;
    
int total_rotate;
    
int kind;

    
int offset_x;
    
int offset_y;

    
int min_col,max_col;
    
int min_row,max_row;
}
;

#endif //TETRIS_H

可能自己设计上的能力还是不足吧,有些函数是不得以写的,比如四个inline函数,因为计算的时候用的是四个循环,计算完就要跳出两层循环。
难道用goto,如果直接return则后面的代码执行不到了,不得以做了四个辅助函数。

源代码下载:TetrisV1.0
可执行文件下载:TetrisV1.0.exe 如果不能运行可到微软下载VS2008的 redist_x86
posted @ 2008-11-09 00:06 foxtail 阅读(1017) | 评论 (3)编辑 收藏

2008年10月26日

C++博客上的蚂蚁终结者的文章都写的不错,它写了个MD5的算法,我就用他的算法写了个小程序。
简单的计算文件的MD5,支持拖拽文件。现