Hex Workshop v6.01 + License File
HTML5游戏:Cut the Rope 花了半个小时过关,挺有趣的,其实设计关卡比过关难度大多了。
多线程编程之一——问题提出
该系列的源代码
www.joygames.com/mini/main/login.aspx?uid=4393838&pwd=85750E3FA2D1BA236BDA394F1E5DC12E
如果uid是1到最大,然后pwd是最新爆出来的常用密码……………
Hex Workshop v6.01 + License File
HTML5游戏:Cut the Rope 花了半个小时过关,挺有趣的,其实设计关卡比过关难度大多了。
多线程编程之一——问题提出
该系列的源代码
www.joygames.com/mini/main/login.aspx?uid=4393838&pwd=85750E3FA2D1BA236BDA394F1E5DC12E
如果uid是1到最大,然后pwd是最新爆出来的常用密码……………
(1)创建数据库
在命令行中切换到sqlite.exe所在的文件夹
在命令中键入sqlite3 test.db;即可创建了一个名为test.db的数据库
由于此时的数据库中没有任何表及数据存在,这时候是看不到test.db的,必须往里面插入一张表即可看到数据库
(2)创建表
create table Test(Id Integer primary key, value text);
此时即可完成表的创建,当把主键设为Integer时,则该主键为自动增长,插入数据时,可直接使用如下语句:
insert into Test values(null,’Acuzio’);
(3)获取最后一次插入的主键: select last_insert_rowid();
(4)sqlite>.mode col
sqlite>.headers on
在数据库查询的时候,显示行数和头!
(5)在DOS中,键入Ctrl+C,退出数据库,Unix中,使用Ctrl+D
(6)SQLite Master Table Schema
—————————————————————–
Name Description
—————————————————————–
type The object’s type (table, index, view, trigger)
name The object’s name
tbl_name The table the object is associated with
rootpage The object’s root page index in the database (where it begins)
sql The object’s SQL definition (DDL)
eg.
sqlite> .mode col
sqlite> .headers on
sqlite> select type, name, tbl_name, sql from sqlite_master order by type;
这样就能看到所有数据库中的信息,表、索引、视图等等
(7)导出数据
.output [filename],导出到文件中,如果该文件不存在,则自动创建
.dump 导出数据命令
.output stdout 返回输出到屏幕(进行其他操作)
eg.
sqlite>.output Acuzio.sql
sqlite>.dump
sqlite>.output stdout
这样就可以把数据导入到Acuzio.sql中
(8)导入数据
导入数据使用.read命令
eg.
如导入(7)中的数据
sqlite>.read Acuio.sql
(9)备份数据库
在切换到Sqlite文件夹
sqlite3 test.db .dump > test.sql
如果在数据库中
sqlite> .output file.sql
sqlite> .dump
sqlite> .exit
(10)导入数据库
在切换到Sqlite文件夹
sqlite3 test.db < test.sql
(11)备份二进制格式数据库,vacuum:释放掉已经被删除的空间(数据和表等被删除,不会被清空空间)
sqlite3 test.db VACUUM
cp test.db test.backup
(12)获取数据库信息
如果想获得物理数据库结构的信息,可以去SQLite网站上下载SQLite Analyzer工具
使用: sqlite3_analyzer test.db
(13)其他的SQLite工具
SQLite Database Browser (http://sqlitebrowser.sourceforge.net)
SQLite Control Center (http://bobmanc.home.comcast.net/sqlitecc.html)
SQLiteManager (www.sqlabs.net/sqlitemanager.php)
(13)SQLite 与其他数据库不同,它是以(;)来执行语句,而不是(go).
(14)SQLite注释(–)或(/* */)
eg.
– This is a comment on one line
/* This is a comment spanning
two lines */
(15)创建表结构
CREATE [TEMP|TEMPORARY] TABLE table_name (column_definitions [, constraints]);
关键字TEMP、TEMPORARY表示创建的是临时表
(16)在SQLite中有5种基本类型:
Integer/Real/Text/Blob/Null
(17)确保唯一性可以用关键字UNIQUE
eg.
CREATE TABLE contacts ( id INTEGER PRIMARY KEY,
name TEXT NOT NULL COLLATE NOCASE,
phone TEXT NOT NULL DEFAULT ‘UNKNOWN’,
UNIQUE (name,phone) );
(18)修改表
ALTER TABLE table { RENAME TO name | ADD COLUMN column_def }
eg.
sqlite> ALTER TABLE contacts
ADD COLUMN email TEXT NOT NULL DEFAULT ” COLLATE NOCASE;
sqlite> .schema contacts
CREATE TABLE contacts ( id INTEGER PRIMARY KEY,
name TEXT NOT NULL COLLATE NOCASE,
phone TEXT NOT NULL DEFAULT ‘UNKNOWN’,
email TEXT NOT NULL DEFAULT ” COLLATE NOCASE,
UNIQUE (name,phone) );
(19)查询
SELECT DISTINCT heading FROM tables WHERE predicate
GROUP BY columns HAVING predicate
ORDER BY columns LIMIT count,offset;
(20)Limit和Offset关键字
Limit 指返回记录的最大行数
Offset 指跳过多少行数据
via http://www.cnblogs.com/Acuzio/archive/2008/09/09/1287958.html
1. 在CMD窗口下输下:chcp 65001 确定
2. 在命令行标题栏上点击右键,选择【属性】 -【字体】,将字体修改为【Lucida Console】 确定
解释一下,因为sqlite3数据存储采用UTF-8。中文windows xp的cmd默认code page是1521
C:\Documents and Settings\Administrator>chcp Active code page: 1251
通过chcp 65001修改为UTF-8。code page(代码页)是字符集的另外一个术语(term)。
具体各种Code page参考:http://en.wikipedia.org/wiki/Code_page
一般CEdit控件默认是可以输入任何的内容,包括数字、字符、符号等。
有时候我们有特殊的需求,限制用户输入合法的QQ号(数字,5<=位数<=10)。
在Dialog的设计器里面右击Edit控件有个Number属性,作用是限制只能输入数字。默认是False,设置为True之后就只能输入数字了。
但是我们还有一个限制位数的需求(5<=位数<=10),这个我们可以通过DDV数据验证机制来完成。在CTestDlg::DoDataExchange()加入:
DDV_MinMaxLongLong(pDX,IDC_QQNUM,10000,9999999999);
当用户输入的范围超出了10000到9999999999这个范围,然后点击确定之后弹出:
以上就是不需要子类化就能完成这个需求。我感觉这并不是一个友好的解决方法,如果有比这个更复杂一点的需求,DDV就没什么作用了。
下来来说说子类化的方法是怎么做的。
假设Edit控件ID是IDC_QQNUM
新建一个QQNumEdit类,基类是CEdit。
QQNumEdit.h:
#pragma once
#include "afxwin.h"
class CQQNumEdit :
public CEdit
{
public:
CQQNumEdit(void);
~CQQNumEdit(void);
protected:
afx_msg void OnChar(UINT nChar, UINT nRepCnt, UINT nFlags);
DECLARE_MESSAGE_MAP()
};
QQNumEdit.cpp:
#include "stdafx.h"
#include "QQNumEdit.h"
CQQNumEdit::CQQNumEdit()
{
}
CQQNumEdit::~CQQNumEdit()
{
}
BEGIN_MESSAGE_MAP(CQQNumEdit,CEdit)
ON_WM_CHAR()
END_MESSAGE_MAP()
void CQQNumEdit::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
if(nChar>='0' && nChar<='9' )
{
CEdit::OnChar(nChar, nRepCnt, nFlags);
}
else
{
return;
}
}
添加了一个OnChar事件。判断输入的范围是否在’0′到’9′,不是就直接return返回。
接下来还需要在父对话框中定义一个CQQNumEdit类型的变量:
class CAddUserDlg : public CDialog
{
//other code.........
public:
CQQNumEdit m_qqNumEdit;
};
接下来在InitDialog中子类化:
BOOL CAddUserDlg::OnInitDialog()
{
m_qqNumEdit.SubclassDlgItem(IDC_QQNUM,this);
//m_qqNumEdit.SetLimitText(10);
//m_qqNumEdit.UnsubclassWindow();
return TRUE;
}
子类化使用SubclassDlgItem。不子类化了,使用UnsubclassWindow。设置字符长度SetLimitText,参数就是字符长度。
在这种情况下子类化的方法无需点“确定”,用户输入错误的数据Edit控件是没显示的。感觉要直接一点。
首先去掉stdafx.h里面的:
#include <afxcontrolbars.h> // MFC support for ribbons and control bars
ribbons界面库vs2005版本木有啊。
将CWndEx类都修改为CWnd。vs2005木有CWndEx。
将真彩色的图标换成256色的。
十个月以前写过“不用MFC AppWizard创建MFC项目”,不过是转载别人的,今天自己来写一次。
首先我们用AppWizard创建一个程序mfc1,然后查看mfc1程序属性里面的C/C++命令行和链接器命令行:
C/C++命令行:
/Od /D “WIN32″ /D “_WINDOWS” /D “_DEBUG” /D “_AFXDLL” /D “_UNICODE” /D “UNICODE” /Gm /EHsc /RTC1 /MDd /Yu”stdafx.h” /Fp”Debug\mfc1.pch” /Fo”Debug\\” /Fd”Debug\vc80.pdb” /W3 /nologo /c /Wp64 /ZI /TP /errorReport:prompt
链接器命令行:
/OUT:”d:\dev\Debug\mfc1.exe” /INCREMENTAL /NOLOGO /MANIFEST /MANIFESTFILE:”Debug\mfc1.exe.intermediate.manifest” /DEBUG /PDB:”d:\dev\debug\mfc1.pdb” /SUBSYSTEM:WINDOWS /ENTRY:”wWinMainCRTStartup” /MACHINE:X86 /ERRORREPORT:PROMPT
接下来我们根据以上命令行来创建一个hardcode程序,添加新项目里面选择“空项目”,然后创建一个头文件hello.h和一个cpp文件hello.cpp(代码来自MFC Windows程序设计(第二版)):
hello.h
class CMyApp : public CWinApp
{
public:
virtual BOOL InitInstance ();
};
class CMainWindow : public CFrameWnd
{
public:
CMainWindow ();
protected:
afx_msg void OnPaint ();
DECLARE_MESSAGE_MAP ()
};
hello.cpp
#include#include "Hello.h" CMyApp myApp; ///////////////////////////////////////////////////////////////////////// // CMyApp member functions BOOL CMyApp::InitInstance () { m_pMainWnd = new CMainWindow; m_pMainWnd->ShowWindow (m_nCmdShow); m_pMainWnd->UpdateWindow (); return TRUE; } ///////////////////////////////////////////////////////////////////////// // CMainWindow message map and member functions BEGIN_MESSAGE_MAP (CMainWindow, CFrameWnd) ON_WM_PAINT () END_MESSAGE_MAP () CMainWindow::CMainWindow () { Create (NULL, _T ("The Hello Application")); } void CMainWindow::OnPaint () { CPaintDC dc (this); CRect rect; GetClientRect (&rect); dc.DrawText (_T ("Hello, MFC"), -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER); }
以上代码的功能是建立一个最简单的窗口,中心位置用CPaintDC显示一些文字。
点击生成,报错:
d:\vs8\vc\atlmfc\include\afx.h(24) : fatal error C1189: #error : Building MFC application with /MD[d] (CRT dll version) requires MFC shared dll version. Please #define _AFXDLL or do not use /MD[d]
提示如果代码生成->运行时库选择了/MD[d]必须定义_AFXDLL,否则不要使用/MD[d]。我们在C/C++->预处理器->预处理器定义加上:WIN32;_WINDOWS;_DEBUG;_AFXDLL;_UNICODE;UNICODE;保持和mfc1程序的一致性。
点击生成,报了另外的错误:
1>正在编译... 1>Hello.cpp 1> WINVER not defined. Defaulting to 0x0502 (Windows Server 2003) 1>正在链接... 1>LINK : 没有找到 d:\dev\Debug\hardcode.exe 或上一个增量链接没有生成它;正在执行完全链接 1>LINK : fatal error LNK1561: 必须定义入口点
新建一个stdafx.h作预编译头,内容是一些定义版本的信息:
#ifndef WINVER // 允许使用特定于 Windows XP 或更高版本的功能。 #define WINVER 0x0501 // 将此值更改为相应的值,以适用于 Windows 的其他版本。 #endif #ifndef _WIN32_WINNT // 允许使用特定于 Windows XP 或更高版本的功能。 #define _WIN32_WINNT 0x0501 // 将此值更改为相应的值,以适用于 Windows 的其他版本。 #endif #ifndef _WIN32_WINDOWS // 允许使用特定于 Windows 98 或更高版本的功能。 #define _WIN32_WINDOWS 0x0410 // 将它更改为适合 Windows Me 或更高版本的相应值。 #endif #ifndef _WIN32_IE // 允许使用特定于 IE 6.0 或更高版本的功能。 #define _WIN32_IE 0x0600 // 将此值更改为相应的值,以适用于 IE 的其他版本。值。 #endif
然后设置 C/C++ -> 预编译头 -> 创建/使用预编译头 -> 创建预编译头(/Yu)。
在hello.cpp文件中的最顶部加入
#include "stdafx.h"
然后设置 链接器 -> 系统 -> 子系统 -> Windows (/SUBSYSTEM:WINDOWS)
设置 链接器 -> 高级 -> 入口点 -> wWinMainCRTStartup
点击生成,OK了。
解说Win32的窗口子类化(源代码需要库币,点这里直接下载)
MFC/C++ Helper Class for Window Resizing(WndResizer) 一个封装得不错的MFC窗口控件大小自适应工具,仿winform思想。
EasySize – Dialog resizing in no time!(MFC空间自适应大小,这个EasySize还算不错,用宏来实现,不过自定义性差了点,哥的需求无法满足啊)
朝鲜领导人金正日生平(不要高兴、金正恩即将登场)
http://zh.wikipedia.org/wiki/戈尔巴乔夫 (SyntaxHighter作者也姓Gorbatchev,不过貌似是美国人)
海警殉职,韩国人为何愤怒 小偷杀人了,主人怒了。
http://tunps.com/lab/c/ConsoleQ.c
代码太多,直接传文件。
用libcurl做http request。
用yajl解析json。
哥将md5算法的javascript实现转为了C语言。转换中发现了一些有趣的东西:>>>(无符号的右移运算符,JS特有,C没有这个运算符,但是C可以通过>>的逻辑右移来实现此运算)
WebQQ的登录过程分一下几个步骤,网上已经有详细的讲解,我就不详讲了。
后续的获取好友列表,接受、发送消息没做。都是用json做交互。哥发现了yajl一处不好用的地方[1,2]就没有继续写下去了。暂时到这里吧。
function str2binl(D) {
var C = Array();
var A = (1 << chrsz) - 1;
for (var B = 0; B < D.length * chrsz; B += chrsz) {
C[B >> 5] |= (D.charCodeAt(B / chrsz) & A) << (B % 32)
}
return C
}
function binl2str(C) {
var D = "";
var A = (1 << chrsz) - 1;
for (var B = 0; B < C.length * 32; B += chrsz) {
D += String.fromCharCode((C[B >> 5] >>> (B % 32)) & A)
}
return D
}
两个来自:http://imgcache.qq.com/ptlogin/ac/v9/js/comm.js?v=1.2.35 的JS函数。
字符串和数字之间转换。值得研究。