1 radio button 取消选中
双击控件添加变量,顺便把“点击已阅读协议后激活登入按钮”的功能实现了
CWnd* GetDlgItem(int nID) //根据控件的ID,获取控件对象,记得转换类型
使用变量标记是否是第一次选中
static BOOL flag = 0;
void CloginDlg::OnBnClickedReadRadio()
{
// TODO: 在此添加控件通知处理程序代码
int isChecked = ((CButton*)GetDlgItem(IDC_READ_RADIO))->GetCheck();
((CButton*)GetDlgItem(IDC_SIGNIN_BUTTON))->EnableWindow(TRUE);
if (isChecked && flag)
{
((CButton*)GetDlgItem(IDC_READ_RADIO))->SetCheck(FALSE);
((CButton*)GetDlgItem(IDC_SIGNIN_BUTTON))->EnableWindow(FALSE);
flag = FALSE;
return;
}
flag = TRUE;
}
2 combo box 的使用
2.1 控件添加数据
2.1.1 直接在属性中添加
设置ComboBox的data属性,不同的选项用 “;” 隔开
2.1.2 通过变量添加
m_combo.AddString(L"IS");
m_combo.AddString(L"CS");
m_combo.AddString(L"MA");
// 在自定义位置处添加
m_combo.InsertString(0, L"IS");
m_combo.InsertString(1, L"CS");
m_combo.InsertString(2, L"MA");
2.2 设置默认值
int SetCurSel(int nSelect);
// nSelect 下标
3 创建右键菜单
在资源视图添加菜单资源,给窗口消息WM_CONTEXTMENU添加处理程序
void CedusysDlg::OnContextMenu(CWnd* pWnd, CPoint point)
{
// TODO: 在此处添加消息处理程序代码
//从资源文件中加载指定ID的菜单
CMenu t_menu;
t_menu.LoadMenu(IDR_MENU_RIGHT);
//获得指定ID菜单的所有子菜单
CMenu* t_pMenu;
t_pMenu = t_menu.GetSubMenu(0);
//EnableMenuItem的意思是允许、禁止或变灰指定的菜单条目。
//为每一个子菜单设置状态
t_pMenu->EnableMenuItem(ID_HELP_VIEW, MF_BYCOMMAND | MF_ENABLED);//激活转态
t_pMenu->EnableMenuItem(ID_HELP_UPIN, MF_BYCOMMAND | MF_ENABLED);//激活转态
t_pMenu->EnableMenuItem(ID_HELP_ABOUT, MF_BYCOMMAND | MF_ENABLED);//激活转态
t_pMenu->EnableMenuItem(ID_HELP_CHECK, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);
//禁用状态,灰色
//在鼠标点击处的位置加载出来菜单项
t_pMenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y, this);
t_pMenu->Detach();
t_menu.DestroyMenu();
}
4 创建函数加密和解密
把这个函数定义删光光之后 秘钥你就看不见啦
将功能封装成函数 秘钥就能保密啦
CREATE OR REPLACE FUNCTION public.func_encrypt(x character, OUT y text)
RETURNS text
LANGUAGE plpgsql
NOT FENCED NOT SHIPPABLE
AS $$
begin
SELECT gs_encrypt_aes128(x, 'Asdf1234') into y;
end; $$;
/
注册登入函数 flag=0的时候是注册,其他时候是登入
CREATE OR REPLACE FUNCTION public.func_InOrUp(x TEXT, y TEXT, flag INTEGER)
RETURNS INTEGER
LANGUAGE plpgsql
NOT FENCED NOT SHIPPABLE
AS $$
DECLARE
xx CHAR(5);
yy VARCHAR(20);
xxx CHAR(5);
yyy VARCHAR(20);
i TEXT;
j TEXT;
BEGIN
SELECT gs_decrypt_aes128(x, 'Asdf1234') INTO xx;
SELECT gs_decrypt_aes128(y, 'Asdf1234') INTO yy;
-- 循环判断加密后用户信息表里有无记录
FOR i, j IN (SELECT eid, epwd FROM en_user_info) LOOP
SELECT gs_decrypt_aes128(i,'Asdf1234') INTO xxx;
SELECT gs_decrypt_aes128(j,'Asdf1234') INTO yyy;
IF xx=xxx AND yy=yyy THEN RETURN 1;-- 有记录的话就可以溜了
END IF;
END LOOP;
-- if flag=0 -> signup
-- 没记录而且是注册操作 就往用户表里添加加密后的信息
IF flag=0 THEN INSERT INTO en_user_info VALUES (x, y);
END IF;
RETURN 0;
END;
$$;
/
5 获取表头
使用ListControl打印SQL执行结果需要获取结果的表头
SELECT a.attname AS field
FROM pg_class c, pg_attribute a
LEFT JOIN pg_description b
ON a.attrelid = b.objoid
AND a.attnum = b.objsubid, pg_type t
WHERE c.relname = '表名'
AND a.attnum > 0
AND a.attrelid = c.oid
AND a.atttypid = t.oid
ORDER BY a.attnum;
使用EditControl接受用户输入,EditControl需要将"Want return"属性设置为TRUE
重载虚函数PreTranslateMessage,判断按键消息类型和焦点,实现当按下Ctrl+Enter组合键时运行SQL结果打印函数
void CedusysDlg::PrintSQLResult()
{
// TODO: 在此处添加实现代码.
m_listStu.DeleteAllItems();// 清空所有表项
while (m_listStu.DeleteColumn(0));// 清空所有表头
CString t_sql, t_editSQL, t_str;
((CEdit*)GetDlgItem(IDC_EDIT_SQL))->GetWindowTextW(t_editSQL);
if (t_editSQL.IsEmpty()) {// 如果控件内容为空就返回
return;
}
TRY{
CRecordset t_set(&g_db);
// 去除语句中的‘;’,不然会报错,本函数只支持运行一条SQL语句并打印
if (t_editSQL.ReverseFind(L';') == t_editSQL.GetLength() - 1) {
t_editSQL = t_editSQL.Left(t_editSQL.GetLength() - 1);
}
/*t_editSQL.Replace(L";", L"");*/// error: 这会导致忽略某些语法错误
t_sql.Format(L"drop table if exists temp_table;\
select * into temp_table from (%s);", t_editSQL);
// 使用执行的结果创建一个表(如果表在操作前存在,就删除)
g_db.ExecuteSQL(t_sql);
t_sql = L"SELECT a.attname AS field\
FROM pg_class c, pg_attribute a\
LEFT JOIN pg_description b\
ON a.attrelid = b.objoid\
AND a.attnum = b.objsubid, pg_type t\
WHERE c.relname = 'temp_table'\
AND a.attnum > 0\
AND a.attrelid = c.oid\
AND a.atttypid = t.oid";// 获取表头
int i = 0;
if (t_set.Open(AFX_DB_USE_DEFAULT_TYPE, t_sql)) {
if (t_set.IsBOF()) {
AfxMessageBox(L"该表格数据集为空");
return;
}
while (!t_set.IsEOF()) {
t_set.GetFieldValue((short)0, t_str);
m_listStu.InsertColumn(i++, t_str, LVCFMT_LEFT, 100);// 插入表头
t_set.MoveNext();// 这一句是必须的,移动指针
}
m_listStu.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);
}
t_set.Close();// 这一句是必须的,CRecordset类变量必须处于关闭才能打开
if (t_set.Open(AFX_DB_USE_DEFAULT_TYPE, t_editSQL)) {
if (t_set.IsBOF()) {
AfxMessageBox(L"该表格数据集为空");
return;
}
int k = 0;
while (!t_set.IsEOF()) {
t_set.GetFieldValue((short)0, t_str);
m_listStu.InsertItem(k, t_str);// 必须先创建行才能往行中插入元素
for (int j = i - 1; j > 0; j--) {
t_set.GetFieldValue((short)(i - j), t_str);
m_listStu.SetItemText(k, i - j, t_str);
}
k++;
t_set.MoveNext();
}
t_set.Close();
}
g_db.ExecuteSQL(L"drop table if exists temp_table;");
}
CATCH(CDBException, error) {
AfxMessageBox(L"Database error: " + error->m_strError);
}
END_CATCH;
}