网上相关教程不少,但有一个问题要提醒大家一下:
一定要在关闭VS的情况下去修改注册表中的扩展名。因为在VS退出的时候,VisualAssist会用当前设置写入注册表,也就是说你的改动被覆盖了,导致无法高亮。
这学期开了CUDA课程,平时没事干敲敲书上的例子,但Julia集程序一运行就导致显卡驱动停止响应。我试着把DIM的定义从1000改为500,倒是可以了,但是出来的内容不对。后来在网上百度了一下,发现是显卡响应时间有限制。解决方法如下:
打开安装CUDA时安装的Nsignt monitor(可能在开始菜单),它会在后台运行。
右键点击它在系统托盘里的图标,选择弹出菜单中的options,可以看到有一个选项是WDDM TDR Delay。
这个选项的值通常是2,也就是两秒。我们把它改成10.
保存后重新启动计算机,再次运行Julia集示例程序,成功。
我目前还在做Windows程序设计的课程实验,开发一个编辑器。我尝试设置鼠标光标样式为IDC_IBEAM
SetCursor(LoadCursor(IDC_IBEAM));
但是没有什么作用,鼠标会在点击左键的时候消失一下,一移动又回来了,不过还是原来的光标。
在网上查到,需要在SetCursor之前先设置原来的光标不显示,设置之后再显示新的光标。
ShowCursor(FALSE); SetCursor(LoadCursor(IDC_IBEAM)); ShowCursor(TRUE);
结果依然令人失望。幸运的是,我在网上找到了这样一个解答:
如果产生了鼠标消息,系统可能会用窗口的hcursor重新刷新光标,
所以用
SetClassLong(hwnd,GCL_HCURSOR,(long)LoadCursor(NULL,IDC_CROSS));
才能一直保持。
按这个方法尝试后,鼠标成功地变成了插入符,并且不受点击等鼠标操作影响。
MessageBox 是Windows系统库 user32.dll 的一个导出函数,用于显示一个提示消息对话框,其原型定义如下 :
int MessageBox( HWND hWnd, // handle to owner window LPCTSTR lpText, // text in message box LPCTSTR lpCaption, // message box title UINT uType // message box style );
可以看到有四个参数,第一个是消息框所有者窗口句柄,可以是NULL,第二个是消息框的文本内容,第三个是消息框标题,第四个参数是消息框样式(按钮和图标)。
按钮样式及常量(可用【样式=数字】表示)
0、确定按钮; _MB_OK=@0x0
1、确定、取消按钮; _MB_OKCANCEL=@0x1
2、终止、重试、忽略按钮;_MB_ABORTRETRYIGNORE=@0x2
3、是、否、取消按钮;_MB_YESNOCANCEL=@0x3
4、是、否按钮;_MB_YESNO=@0x4
5、重试取消钮;_MB_RETRYCANCEL=@0x5
6、终止、重试、继续 0x00000006(需声明API才能使用)
图标常量
_MB_ICONASTERISK=@0x40/ “i”图标
_MB_ICONEXCLAMATION=@0x30/ “!”号图标
_MB_ICONHAND=@0x10 / “×” 号图标
_MB_ICONINFORMATION=@0x40 / “i” 图标
_MB_ICONMASK=@0xF0 / “i” 图标
_MB_ICONQUESTION=@0x20/ “?” 号图标
_MB_ICONSTOP=@0x10/ “×” 号图标
按钮返回值
1=确定钮; IDOK
2=取消钮; IDCANCEL
3=终止钮; IDABORT
4=重试钮; IDRETRY
5=忽略钮;IDIGNORE
6=是钮;IDYES
7=否钮;IDNO
当用户点击右上角的关闭按钮时,发出的是WM_CLOSE消息,该消息意味着关闭窗口。
这个消息的处理方式是调用DestroyWindow()来发出WM_DESTROY消息。
而WM_DESTROY消息意味着关闭程序,这个消息的处理方式是调用PostQuitMessage()来发送WM_QUIT,以退出程序。
我在做Windows程序设计课程实验的时候,参照书上的例子使用了strcpy,结果VS报错说这个函数不安全,应该使用strcpy_s。
两者有什么区别呢?其实是因为strcpy无法判断他的操作对象是否有足够的缓冲区,若缓冲区不够的话,就会发生溢出。
strcpy_s避免了这个问题。它会显式地向你报告缓冲区不足的错误,避免丈二和尚摸不着头脑。
dirent是一个定义于dirent.h中的结构体,用于控制目录文件。
其定义如下:
struct dirent { #ifndef __USE_FILE_OFFSET64 __ino_t d_ino; __off_t d_off; #else __ino64_t d_ino; __off64_t d_off; #endif unsigned short int d_reclen; unsigned char d_type; char d_name[256]; /* We must not include limits.h! */ };
其中的d_type数据成员是一个枚举型变量,用于描述文件的类型。其对应的文件类型如下:
/* File types for `d_type'. */ enum { DT_UNKNOWN = 0, # define DT_UNKNOWN DT_UNKNOWN DT_FIFO = 1, # define DT_FIFO DT_FIFO DT_CHR = 2, # define DT_CHR DT_CHR DT_DIR = 4, # define DT_DIR DT_DIR DT_BLK = 6, # define DT_BLK DT_BLK DT_REG = 8, # define DT_REG DT_REG DT_LNK = 10, # define DT_LNK DT_LNK DT_SOCK = 12, # define DT_SOCK DT_SOCK DT_WHT = 14 # define DT_WHT DT_WHT };
首先,我们来看一下mode_t类型的结构
可以看出,文件的权限位于这个变量的最后9位上。
这是特征位的定义
于是我尝试用这样的语句获取权限特征位:
printf("%o %o %o\n", buff.st_mode&S_IRWXU, buff.st_mode&S_IRWXG, buff.st_mode&S_IRWXO);
但得到的输出是700 60 6
于是我把代码写成了这样
printf("%o\n", (buff.st_mode&S_IRWXU)+(buff.st_mode&S_IRWXG)+(buff.st_mode&S_IRWXO));
就得到了正确的结果:766。
这里需要说明的是,貌似C中+号的运算优先级比&高,所以要使用括号来保证按位与运算先进行。