创建非模态对话框

shared_ptr<CFloatWin> m_pDlgFloat;

m_pDlgFloat.reset(new CFloatWin());
m_pDlgFloat->Create(IDD_FLOATWIN);
m_pDlgFloat->ShowWindow(SW_SHOW);

// 结束是销毁窗口
void CiPcPayTesterDlg::OnDestroy()
{
m_pDlgFloat->DestroyWindow();
m_pDlgWaite->DestroyWindow();
if (m_pDlgPayMain)
{
m_pDlgPayMain->DestroyWindow();
}

m_sysIcon.deleteIcon();
CDialogEx::OnDestroy();
}

// 对话框内部调用下面函数结束
DestroyWindow();

void CDlgFetchDataNotice::OnBnClickedOk()
{
// TODO: Add your control notification handler code here
((CAlarmViewerDlg*)AfxGetMainWnd())->abortFetchData();
DestroyWindow();
}

void CDlgFetchDataNotice::PostNcDestroy()
{
CDialog::PostNcDestroy();
delete this;
}

阅读全文 »

创建非模态对话框

shared_ptr<CFloatWin> m_pDlgFloat;

m_pDlgFloat.reset(new CFloatWin());
m_pDlgFloat->Create(IDD_FLOATWIN);
m_pDlgFloat->ShowWindow(SW_SHOW);

// 结束是销毁窗口
void CiPcPayTesterDlg::OnDestroy()
{
m_pDlgFloat->DestroyWindow();
m_pDlgWaite->DestroyWindow();
if (m_pDlgPayMain)
{
m_pDlgPayMain->DestroyWindow();
}

m_sysIcon.deleteIcon();
CDialogEx::OnDestroy();
}

// 对话框内部调用下面函数结束
DestroyWindow();

void CDlgFetchDataNotice::OnBnClickedOk()
{
// TODO: Add your control notification handler code here
((CAlarmViewerDlg*)AfxGetMainWnd())->abortFetchData();
DestroyWindow();
}

void CDlgFetchDataNotice::PostNcDestroy()
{
CDialog::PostNcDestroy();
delete this;
}

实现客户区拖拽移动功能

说明:还有一种是重载WM_NCHITTEST事件,但是这样会无法响应WM_LBUTTONDOWN等鼠标消息。
因为在WM_NCHITTEST中处理了鼠标消息,把他定位成HTCAPTION,也就是鼠标在标题栏上,而标题栏属于非客户区(NC),非客户区的事件消息都是以WM_NC开头的,只能用WM_NCLBUTTONUP来处理。

目前看还是使用下面的方式比较好用。

在程序获得左键按下的状态时,发送以下任一系统消息都可以实现悬浮窗的拖拽。
1.SendMessage(WM_SYSCOMMAND, SC_MOVE | HTCAPTION, 0);
2.PostMessage(WM_NCLBUTTONDOWN,HTCAPTION,MAKELPARAM(point.x,point.y));

void CFloatWin::OnLButtonDown(UINT nFlags, CPoint point)
{
::SetCursor(AfxGetApp()->LoadStandardCursor(IDC_HAND));

PostMessage(WM_NCLBUTTONDOWN, HTCAPTION, MAKELPARAM(point.x, point.y));

CDialog::OnLButtonDown(nFlags, point);
}

回车,ESC程序退出问题

BOOL CnumberConverterDlg::PreTranslateMessage(MSG* pMsg)
{
// TODO: Add your specialized code here and/or call the base class

if ( pMsg->message == WM_KEYDOWN )
{
switch(pMsg->wParam)
{
case VK_ESCAPE:
return TRUE; //直接返回TRUE
break;
case VK_RETURN:
return TRUE;
break;
}
}

return CDialog::PreTranslateMessage(pMsg);
}

任务栏图标

ModifyStyleEx(0, WS_EX_APPWINDOW);  // 恢复任务栏显示.
ModifyStyleEx(WS_EX_APPWINDOW, 0);//从任务栏中去掉.

启动时最小化

BOOL CFSNProcDlg::OnInitDialog()
{
...
ModifyStyleEx(WS_EX_APPWINDOW, WS_EX_TOOLWINDOW);
...
}

LRESULT CFSNProcDlg::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
// TODO: Add your specialized code here and/or call the base class
if(message == WM_NCPAINT)
{
ShowWindow(SW_HIDE);
return 0;
}
return CDialogEx::DefWindowProc(message, wParam, lParam);
}

启动时隐藏

这个方法好,启动没有白屏一闪的问题

private:
BOOL m_visible;

m_visible = FALSE;

void CYourDialog::OnWindowPosChanging(WINDOWPOS FAR* lpwndpos)
{
if(!m_visible)
{
lpwndpos->flags &= ~SWP_SHOWWINDOW;
}

CDialog::OnWindowPosChanging(lpwndpos);
}
// 需要显示的时候
//...
m_visible = TRUE;
ShowWindow(SW_SHOW);
//...

AfxMessageBox

if (IDYES == AfxMessageBox(L"发现新版本,是否现在升级\r\n如果选No,可以稍后手动退出程序完成升级", MB_YESNO))
{
OnRmenuquit();
}
返回值 说明
IDABORT The Abort button was selected.
IDCANCEL The Cancel button was selected.
IDIGNORE The Ignore button was selected.
IDNO The No button was selected.
IDOK The OK button was selected.
IDRETRY The Retry button was selected.
IDYES The Yes button was selected.

悬浮窗:
是一个无边框可以拖动的窗口
可以贴图,设置透明度,双击可实现主窗口的显示和隐藏,右键有菜单,可以实现快捷操作,在任务栏中不显示

  1. 无边框,可拖动
LRESULT CFloatWin::OnNcHitTest(CPoint point)
{
// TODO: Add your message handler code here and/or call default
LRESULT nHitTest = CDialog::OnNcHitTest(point);
;
if (nHitTest == HTCLIENT)
{
nHitTest = HTCAPTION;
}
return nHitTest;
}

上午试题 75道选择题

单科满分75分,45分合格。上、下午考试的成绩必须都过合格线,才能获得合格证。
如果有单科没及格,其他及格单项成绩不予保留,第二次考试时必须全部重考。
考试两个月后 成绩查询
考试六个月后 领取证书

上午考点

补码,进制转换

16进制 → 10进制:从右往左,16的0,1,2…次方*原有的数然后相加
将十六进制的(2B)H转换为十进制的步骤如下:

  1. 第0位 B x 16^0 = 11;
  2. 第1位 2 x 16^1 = 32;
  3. 读数,把结果值相加,11+32=43,即(2B)H=(43)D。

二进制转10进制算法同上,就是换成2的0,1,2…次方
例:将二进制的(101011)B转换为十进制的步骤如下:

  1. 第0位 1 x 2^0 = 1;
  2. 第1位 1 x 2^1 = 2;
  3. 第2位 0 x 2^2 = 0;
  4. 第3位 1 x 2^3 = 8;
  5. 第4位 0 x 2^4 = 0;
  6. 第5位 1 x 2^5 = 32;
  7. 读数,把结果值相加,1+2+0+8+0+32=43,即(101011)B=(43)D。
阅读全文 »

旅行物品

提前订好来回车票,酒店
剃须刀,耳机,充电器,充电宝,kindle,现金
牙刷,乳液,洗浴用品,木梳。

使用flask搭建一个网站。

这个是我学习flask的一个学习笔记。
这里使用pycharm和python3.6,系统环境是macOS 10.12,MySQL5.6.36

GitHub
优豆
YouTube

创建flask虚拟环境

conda create --name flaskStudyPy36 python=3.6
source activate flaskStudyPy36

安装flask,和相关扩展

pip install flask
数据库操作,这个是py3的库,配置及相关操作参考flask学习笔记-数据库相关
pip install PyMySQL
数据库ORM扩展包
pip install flask-sqlalchemy
数据库迁移扩展包
pip install flask-migrate
查看flask版本,顺便还能看到所在环境的python的版本
flask --version

使用pycharm新建一个flask项目flaskTemplate

  1. 建立初步的项目结构,在pycharm新建项目时,选择上面建立的flaskStudyPy36虚拟环境
  2. 因为使用了anaconda所以虚拟环境路径是anaconda/envs/flaskStudyPy36/bin/python3.6
  3. 把自动生成的flaskTemplate.py改成run.py作为入口
    修改run.py内容,这里稍微说一下最开始的coding设置,在有中文的情况下最好带上
# coding:utf-8
import os

from src import create_app

app = create_app(os.getenv('FLASK_CONFIG') or 'default')


if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000,debug=True)

建立项目结构

  1. 新建一个python package - “src”,用来放我们的程序
  2. 把static和templates移到src下面
  3. 新建一个python package - “site”,用来放网页处理部分
  4. 新建一个python package - “api”,用来放api接口
  5. 新建一个python package - “admin”,用来放后台管理部分
  6. static下面建立目录-css/images/js,css和js下面建立目录ext用来放第三方的库
  7. 把static目录复制到src/admin, src/site下面
  8. 新建一个python package - “models”,用来放数据模型
  9. 在src,src/admin,src/site下面新建目录 - “templates”

src/templates用来放公共模板。各自蓝图下面的templates放各自的模板,
src/static也是用来放公共资源的,各自蓝图下面的static放各自使用的静态资源。

添加代码文件

修改src/site/__init__.py

# coding:utf-8
from flask import Blueprint

site = Blueprint('site', __name__, template_folder='templates',static_folder='static')

# 末尾导入是为了避免循环导入依赖
from . import routes, errors

新建Python文件src/site/routes.py 用来定义视图处理,这里要注意虽然还没用到User模型操作数据库,
但是这里要引用进来不然后面使用migrate初始化的时候会无法发现数据模型,导致不会在数据库里面建表。

# coding:utf-8
from flask import abort
from flask import render_template
from jinja2 import TemplateNotFound
from src.models.modelUser import User

from src.site import site


@site.route('/', methods=['GET'])
def base():
try:
return render_template("index.html")
except TemplateNotFound:
abort(404)

新建html文件src/site/templates/index.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
Hi there!
</body>
</html>

新建Python文件src/site/errors.py自定义错误页面

# coding:utf-8
from flask import render_template, app

from src.site import site


@site.app_errorhandler(404)
def page_not_found(e):
return render_template('404.html'), 404


@site.app_errorhandler(500)
def internal_server_error(e):
import traceback
traceback.print_exc()
errMsg = traceback.format_exc()
app.logger.exception('error 500: %s', errMsg)
return render_template('500.html'), 500

src/templates下面添加html文件src/site/templates/404.htmlsrc/site/templates/500.html
这里目前有404和500两个自定义错误页面

修改src/api/__init__.py

# coding:utf-8
from flask import Blueprint

api = Blueprint('api', __name__)

新建Python文件src/api/routes.py 用来定义视图处理

from src.api import api


@api.route('/users')
def getUsers():
return '{"result":"users info"}';

修改src/admin/__init__.py文件

# coding:utf-8
from flask import Blueprint

admin = Blueprint('admin', __name__, template_folder='templates',static_folder='static')

新建Python文件src/admin/routes.py 用来定义视图处理

from src.admin import admin


@admin.route('/')
def index():
return '{"result":"admin page"}';

修改src/__init__.py文件

# coding:utf-8
from flask import Flask
from flask_migrate import Migrate
from flask_sqlalchemy import SQLAlchemy

from config import config

db = SQLAlchemy()
migrate = Migrate()


# 使用工厂函数创建实例
def create_app(config_name):
app = Flask(__name__)
app.config.from_object(config[config_name])
config[config_name].init_app(app)

db.init_app(app)
migrate.init_app(app, db)

# 路由和自定义错误页面
from src.site.routes import site
from src.api.routes import api
from src.admin.routes import admin

app.register_blueprint(site)
app.register_blueprint(api, url_prefix='/api/v1.0')
app.register_blueprint(admin, url_prefix='/admin')

return app

新建数据模型文件src/models/modelUser.py

# coding:utf-8
from src import db


class User(db.Model):
__tablename__ = 't_users'
id = db.Column('f_id', db.Integer, primary_key=True, autoincrement=True)
# name = db.Column('f_userName', db.String(80), unique=True, nullable=False, server_default='', index=True)
name = db.Column('f_userName', db.String(80), unique=True, nullable=False, server_default='')
password = db.Column('f_password', db.String(80), nullable=False)
email = db.Column('f_email', db.String(80), unique=True, nullable=True, server_default='')

def __init__(self, name, password, email ):
self.name = name
self.password = password
self.email = email

def __repr__(self):
return '<User %r>' % self.name

run.py同级路径下新建config.py文件,内容如下:

# coding:utf-8
import os

basedir = os.path.abspath(os.path.dirname(__file__))


class Config:
DEBUG = False
TESTING = False
# 登录设置 session cookie使用
SECRET_KEY = os.environ.get('SECRET_KEY') or 'catsknowsSECRETkEY'

# database config
# mysql+pymysql://name:password@localhost/db_name
SQLALCHEMY_DATABASE_URI = os.environ.get(
'DEV_DATABASE_URL') or 'mysql+pymysql://gisServer:adminGisServer@localhost:3306/flaskStudy'
SQLALCHEMY_COMMIT_ON_TEARDOWN = True
SQLALCHEMY_TRACK_MODIFICATIONS = False

@staticmethod
def init_app(app):
pass


class DevelopmentConfig(Config):
DEBUG = True
SQLALCHEMY_DATABASE_URI = os.environ.get(
'DEV_DATABASE_URL') or 'mysql+pymysql://gisServer:adminGisServer@localhost:3306/flaskStudy'


class TestingConfig(Config):
TESTING = True


class ProductionConfig(Config):
SQLALCHEMY_DATABASE_URI = os.environ.get(
'DEV_DATABASE_URL') or 'mysql+pymysql://gisServer:adminGisServer@localhost:3306/flaskStudy'


config = {
'development': DevelopmentConfig,
'testing': TestingConfig,
'production': ProductionConfig,

'default': DevelopmentConfig
}

注意这时还需要在 pycharm 里面配置一下才能 debug

20200407_203858.png 20200407_203923.png

验证程序

右键点击run.py选择debug运行,应该可以看到index页面信息,
输入/api/v1.0/users/admin应该可以看到返回的json数据
输入/aa应该可以看到404页面

系统自带拾色器

Launchpad-other-digital color meter

通过代理使用 brew

export ALL_PROXY=socks5://127.0.0.1:1080

显示所有文件

执行命令后,还需要重启 Finder,隐藏的 gitigore 文件才会显示出来。
可以按下”Alt”键并右击或两指点击 Finder 图标。选择”重新启动”。

打开
defaults write com.apple.finder AppleShowAllFiles -bool true
关闭
defaults write com.apple.finder AppleShowAllFiles -bool false

多次打开同一个程序

终端运行

open -n /Applications/scitools/bin/macosx/Understand.app

带参数打开程序

open -a /Applications/Primecoin-Qt.app/Contents/MacOS/Primecoin-Qt  --args -txindex=1 -addrindex=1 -datadir=/Volumes/workUse/primecoinMainData_mac

quicktime 快进

1.接下来我将介绍一下,QuickTime Player 如何以 2、4 倍播放:
苹果的 QuickTime Player 播放器上点击双箭头按钮可以用 2、4、8 倍的速度快进/快退播放视频,但是 2 倍速太快了.
2.QuickTime Player 如何以 1.2、1.3 倍播放:
按住 option 键,再点击双箭头,每点击一次,播放速度就会增加 0.1 倍而不是 ×2 倍了。既不会错过精彩画面也不会浪费太多时间。O

创建文件或目录的软连接

ln -s src dest

使用 ruby

自带版本是 2.0,有时会需要更高的版本。这里使用 rvm(Ruby Version Manager)来管理
安装 rvm

curl -L get.rvm.io | bash -s stable
source ~/.bashrc
source ~/.bash_profile
检查是否安装成功
rvm -v

列出已知 ruby 的版本
rvm list known

安装 ruby 2.3
rvm install 2.3

编辑 host 文件

$ sudo nano /etc/hosts

更新 DNS cache

编辑完 host 文件,需要更新一下

sudo killall -HUP mDNSResponder

终端移动光标

Ctrl + A/E 至行首/尾

查看哪些软件包要被清除

brew cleanup -n

清除所有软件包的所有老版本

brew cleanup

列出已安装的软件

brew list

  1. 设置快捷键 spotlight 使用 ctrl+space,input 使用 cmd+space

  2. 翻墙先 https://www.snshijie.com/ 这里用到 lastpass 邮箱是 gmail 密码要记得

  3. 下载 chrome 登陆账户

  4. 下载 iTerm2 https://www.iterm2.com/index.html
    sudo nano ~/.bash_profile
    alias ll='ls -alF'
    保存后source ~/.bash_profile

  5. 安装 Beyond Compare

  6. 安装 node.js https://nodejs.org/en/

  7. 下载 atom https://atom.io/

  8. 安装 homebrew https://brew.sh/
    通过代理使用 brew
    export ALL_PROXY=socks5://127.0.0.1:1080

  9. 安装 git 下载安装或者 brew install git 都可以

  10. 安装 hexo
    next 主题
    https://github.com/theme-next/hexo-theme-next

  11. 安装 anaconda python3.6

如果出现以下弹框,这说明你没有修改 hosts 文件,或说没生效

  1. 下载百度网盘 里面有常用工具

  2. 安装 golang

  3. 安装 Datagrip

  4. 安装 mysql 5.6.39
    下载安装包 https://www.mysql.com/downloads/ 注意版本
    具体操作参见“MySQL 学习”文章

  5. 安装 webstorm

  6. 安装 QT
    安装 Qt lib 和 Qt Creator
    下载地址

  7. hex 编辑器
    https://ridiculousfish.com/hexfiend/
    https://github.com/ridiculousfish/HexFiend/

记录一下学习bootstrap中总结的知识点。还有代码片段
随时更新

阅读全文 »